﻿Imports Infragistics.Win.UltraWinGrid
Imports Infragistics.Win
Imports Infragistics
' make sure you have this at the top:
Imports System.Windows.Forms.SendKeys
Imports Infragistics.Win.UltraWinEditors

Public Class IUltraGrid
    Inherits UltraGrid
    'tìm kiếm filter cho ultradropdown
    Dim sColumFilter As String = Nothing
    Dim sValueFilter As String = Nothing
    'tìm kiếm theo shift
    Dim flagKeyShift As Boolean = False
    'xử lý trường hợp của trí hâm tìm ra - lưu khi có ultradropdown chọn ko đúng giá trị
    Dim flagSave As Boolean = True
    Dim flagReadOnly As Boolean = False 'lấy trạng thái coi có readonly hay ko 
    Dim uce As UltraComboEditor
    'iudd cho trường hợp thêm iudd
    Dim iudd As IUltraDropDown
    'datatable của iultragrid
    Dim idt As DataTable
    'Dòng trống cuối cùng mất đi 
    Dim LuuXongKhongChoThemDongFlag As Boolean = False
    'tắt cập nhật tức thời - mặc định false
    Dim AfterExitEditModeOn As Boolean = False
    'dùng để xử lý cell khi cập nhật tức thời
    Private origCellVal As Object = Nothing
    'tắt sự kiện khi cần thiết (để xử lý ở lớp kế thừa - con
    Dim AfterCellListCloseUpOn As Boolean = True
    '========== XỬ LÝ CHO SỰ KIỆN KEYDOWN - DI CHUYỂN QUA Ô TIẾP THEO ===================
    'tắt sự kiện khi cần thiết (để xử lý ở lớp kế thừa - con
    Dim KeyDownOn As Boolean = True
    'biết khi nào di chuyển qua ô tiếp theo, khi nào không 
    Dim KeyDownFlag As Boolean
    'biết khi nào không trong danh sách chứa các ô bỏ qua không xổ xuống
    Dim KeyDownLst As ArrayList = New ArrayList
    'biết khi nào set focus qua ultragrid khác
    Dim KeyDownUltraGridNext As IUltraGrid
    'biết cell nào set focus qua ultragrid khác - trường hợp tạo mới dòng
    Dim KeyDownCellStop As String = Nothing
    'biết cell nào set focus qua ultragrid khác - trường hợp không tạo  mới dòng
    Dim KeyDownCellNotNewStop As String = Nothing
    Dim udd As UltraDropDown
    '=========== XỬ LÝ CHO InitializeRow ==================
    Dim rowError As String = ""
    Dim cellError As String = ""
    Dim stencot As String = ""
    Dim dataTable As DataTable
    Dim binding As BindingSource
    Dim adapter As Object
    Dim dataset As DataSet
    Dim InitializeRowlstLoi As ArrayList = New ArrayList
    Dim lstUnique As ArrayList = New ArrayList 'list chứa các cột unique của datatable
    Dim lstSearchShift As ArrayList = New ArrayList 'list chứa các cột unique của datatable
    Dim lstCellDropDown As ArrayList = New ArrayList 'list chứa các cột dropdown
    '============================================
    'xử lý add ngầm các đối tượng vô obj
    Dim obj As ObjUtils = New ObjUtils
    'thêm hastable để xử lý trường hợp mắc định trên row (sự kiện after insert)
    'key = cell cần mặc định
    'value = giá trị mặc định
    Dim htMacDinh As Hashtable = New Hashtable
    '============================================
    'thêm hastable để xử lý trường hợp filter của iultradropdown
    'key = cell cần filter (trên iultragrid)
    'value = giá trị (trên iultragrid)
    Dim htUltraDropDownCell As Hashtable = New Hashtable
    '============================================
    'tạo hashtable cho sự kiện AfterCellListCloseUp 
    'xử lý lấy dữ liệu từ iultradropdown sang iultragrid dựa vào dt
    Dim htAfterCellListCloseUp As Hashtable = New Hashtable

    'Public Sub setMacDinh(ByVal ht As Hashtable)
    '    Me.htMacDinh = ht
    'End Sub
    ''' <summary>
    ''' Để mặc định giá trị cho cột tương ứng khi tạo mới 1 dòng dữ liệu
    ''' </summary>
    ''' <param name="key">là tên cột </param>
    ''' <param name="value">là giá trị mặc định tương ứng với cột đó</param>
    ''' <remarks></remarks>
    Public Sub setMacDinh(ByVal key As Object, ByVal value As Object)
        If htMacDinh.ContainsKey(key) Then
            htMacDinh.Remove(key)
            htMacDinh.Add(key, value)
        Else
            Me.htMacDinh.Add(key, value)
        End If
    End Sub
    ''' <summary>
    ''' chức năng : thêm iultradropdown vô 1 ultragrid 
    ''' </summary>
    ''' <param name="iudd"> iultradropdown cần truyền vào</param>
    ''' <param name="dt">là datatable tương ứng với iultradropdown đó</param>
    ''' <param name="ht">là 1 hashtable (danh sách ánh xạ -  chứa các item (mỗi item có key :  là tên cột iultradropdown , value : là tên cột của iultragrid)</param>
    ''' <remarks></remarks>
    Public Sub setThemIUltraDropDown(ByVal iudd As IUltraDropDown, ByVal dt As DataTable, ByVal ht As Hashtable)
        'obj.addObject(New ObjUtils(iudd,
        'obj.addObject(New ObjUtils(iudd, "", dt, ObjUtils._None))
        For index = 0 To Me.DisplayLayout.Bands(0).Columns.Count - 1
            If Me.DisplayLayout.Bands(0).Columns(index).ValueList Is iudd Then
                obj.addObject(New ObjUtils(iudd, Me.DisplayLayout.Bands(0).Columns(index).Key, dt, ht))
                Exit For
            End If
        Next
    End Sub
    ''' <summary>
    ''' Hàm filter (lọc) dữ liệu cho iultradropdown 
    ''' Sử dụng khi iultradropdown này có sự phụ thuộc dữ liệu cần lọc !
    ''' </summary>
    ''' <param name="iultradropdown"></param>
    ''' <param name="tên_cột_filter_iultragrid">tên cột dữ liệu trên iultragrid</param>
    ''' <param name="tên_cột_filter_iultradropdown">tên cột dữ liệu của iultradropdown</param>
    ''' <remarks>ví dụ ta có 2 iultradropdown gồm : iultradropdownquocgia và iultradropdowntinh - khi đó trên iultradropdowntinh phụ thuộc vào 'maquocgia' (mỗi tỉnh thuộc 1 mã quốc gia)</remarks>
    Public Sub setIUltraDropDownFilter(ByVal iultradropdown As IUltraDropDown, ByVal dt As DataTable, ByVal tên_cột_filter_iultragrid As String, ByVal tên_cột_filter_data As String)
        ' y chang như cũ nhưng lưu 
        'Me.iudd = iultradropdown
        'Me.sColumFilter = tên_cột_filter
        'Me.sValueFilter = giá_trị_filter
        'Dim item As DictionaryEntry

        'For Each item In Me.htUltraDropDownCell 'danh sách tất cả các cell
        '    If item.Key = Me.getCellofPositionUltraDropDownInGrid(Me, iultradropdown) Then 'nên tối ưu
        '        Try
        '            htUltraDropDownCell.Remove(Me.getCellofPositionUltraDropDownInGrid(Me, iultradropdown))
        '            htUltraDropDownCell.Add(Me.getCellofPositionUltraDropDownInGrid(Me, iultradropdown), Me.ActiveRow.Cells(tên_cột_filter_iultragrid).Value)
        '        Catch ex As Exception
        '            MessageBox.Show("filter dropdown " & ex.Message)
        '        End Try
        '        'Exit For
        '    End If
        'Next
        'nếu chưa có trong htUltraDropDownCell
        'If htUltraDropDownCell.ContainsKey(Me.getCellofPositionUltraDropDownInGrid(Me, iultradropdown)) = False Then
        'If obj.getListObjUtilsect.Count = 0 Then
        If obj.getListCellsUltraDropDown.Contains(Me.getCellofPositionUltraDropDownInGrid(Me, iultradropdown)) = False Then
            Dim dtcolone As DataTable = dt.Clone()
            'If sColumFilter IsNot Nothing Then
            'get only the rows you want
            Dim results As DataRow() = dt.Select(tên_cột_filter_data & " ='" & Me.ActiveRow.Cells(tên_cột_filter_iultragrid).Value & "'")
            'Dim results As DataRow() = dt.Select("ma = 'ltp'")
            'populate new destination table
            For Each dr As DataRow In results
                dtcolone.ImportRow(dr)
            Next
            'End If
            obj.addObject(New ObjUtils(iultradropdown, Me.getCellofPositionUltraDropDownInGrid(Me, iultradropdown), tên_cột_filter_iultragrid, tên_cột_filter_data, dtcolone))
        End If

        For index1 As Integer = 0 To obj.getListObjUtilsect.Count - 1 'duyệt tất cả các phần tử
            Dim iudd As IUltraDropDown
            Dim data As DataTable
            Dim sCell As String
            Try
                If CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObjectType = ObjUtils._UltraDropDown Then
                    sCell = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getCell 'lấy cell từ đối tượng có ultradropdown
                    'sCellCheck = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObject, UltraDropDown).ValueMember 'lấy value member
                    iudd = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObject, IUltraDropDown)
                    data = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObj_datatable, DataTable)
                    'kiểm tra coi cell đó là cell nào

                    If Me.getCellofPositionUltraDropDownInGrid(Me, iultradropdown) = sCell Then
                        'If IsDBNull(Me.ActiveCell.Text) Or Me.ActiveCell.Text = "" Or Me.ActiveCell.Text = " " Then
                        '    MessageBox.Show(" Không thể rỗng !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                        '    Return False
                        'Else
                        'If obj.getKiemTraItemTrongDatatable(data, Me.ActiveCell.Text, iudd.ValueMember) = False And obj.getKiemTraItemTrongDatatable(data, Me.ActiveCell.Text, iudd.DisplayMember) = False Then 'nếu ko có trong combobox
                        '    iudd.SelectedRow = iudd.Rows(0)
                        '    'test
                        '    iudd.DataSource = data
                        'Else
                        '    iudd.DataSource = data
                        'End If
                        'remove item 
                        obj.getListObjUtilsect.RemoveAt(index1)
                        Dim dtcolone As DataTable = dt.Clone()
                        'If sColumFilter IsNot Nothing Then
                        'get only the rows you want
                        Dim results As DataRow() = dt.Select(tên_cột_filter_data & " ='" & Me.ActiveRow.Cells(tên_cột_filter_iultragrid).Value & "'")
                        'Dim results As DataRow() = dt.Select("ma = 'ltp'")
                        'populate new destination table
                        For Each dr As DataRow In results
                            dtcolone.ImportRow(dr)
                        Next
                        'End If
                        obj.addObject(New ObjUtils(iultradropdown, Me.getCellofPositionUltraDropDownInGrid(Me, iultradropdown), tên_cột_filter_iultragrid, tên_cột_filter_data, dtcolone))
                    End If
                End If
            Catch ex As Exception
                'thoát khi trường hợp cell không dropdown đc
                'Exit Function
            End Try
        Next
        'If obj.getListObjUtilsect.Count = 0 Then 'trường hợp = 0 (chưa có iultradropdown trong ds)
        '    Dim dtcolone As DataTable = dt.Clone()
        '    'If sColumFilter IsNot Nothing Then
        '    'get only the rows you want
        '    Dim results As DataRow() = dt.Select(tên_cột_filter_iultradropdown & " ='" & Me.ActiveRow.Cells(tên_cột_filter_iultragrid).Value & "'")
        '    'Dim results As DataRow() = dt.Select("ma = 'ltp'")
        '    'populate new destination table
        '    For Each dr As DataRow In results
        '        dtcolone.ImportRow(dr)
        '    Next
        '    'End If
        '    obj.addObject(New ObjUtils(iultradropdown, Me.getCellofPositionUltraDropDownInGrid(Me, iultradropdown), dtcolone, ObjUtils._None))
        'End If
    End Sub
    ''' <summary>
    ''' Thêm Iultradropdown vô iultragrid
    ''' </summary>
    ''' <param name="iudd"> iultradropdown cần truyền vô</param>
    ''' <param name="dt">datatable dữ liệu của iultradropdown đó</param>
    ''' <remarks></remarks>
    Public Sub setThemIUltraDropDown(ByVal iudd As IUltraDropDown, ByVal dt As DataTable)
        'add vô
        'Dim sCell As String = Me.getCellofPositionUltraDropDownInGrid(Me, iudd)
        'obj.addObject(New ObjUtils(iudd, sCell, dt, ObjUtils._None))
        'copy the schema of source table
        'Dim dtcolone As DataTable = dt.Clone()
        'If sColumFilter IsNot Nothing Then

        '    'get only the rows you want
        '    Dim results As DataRow() = dt.Select(Me.sColumFilter & " ='" & Me.sValueFilter & "'")
        '    'Dim results As DataRow() = dt.Select("ma = 'ltp'")
        '    'populate new destination table
        '    For Each dr As DataRow In results
        '        dtcolone.ImportRow(dr)
        '    Next
        'End If
        'tìm kiếm cho ultradropdown 'so sánh tên ultradropdown hoặc cell có bằng nhau không để tính coi cái ultradropdown nào cần tìm theo shift
        'If sColumFilter IsNot Nothing Then
        '    dt = dtcolone
        '    For index = 0 To Me.DisplayLayout.Bands(0).Columns.Count - 1
        '        If Me.DisplayLayout.Bands(0).Columns(index).ValueList Is iudd Then
        '            obj.addObject(New ObjUtils(iudd, Me.DisplayLayout.Bands(0).Columns(index).Key, dtcolone, ObjUtils._None))
        '            Exit For
        '        End If
        '    Next
        'Else
        For index = 0 To Me.DisplayLayout.Bands(0).Columns.Count - 1
            If Me.DisplayLayout.Bands(0).Columns(index).ValueList Is iudd Then
                obj.addObject(New ObjUtils(iudd, Me.DisplayLayout.Bands(0).Columns(index).Key, dt, ObjUtils._None))
                Exit For
            End If
        Next
        'End If


    End Sub
    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        'Add your custom paint code here
    End Sub
    ''' <summary>
    ''' Thay đổi giao diện để các cột tự động vừa khít so với khung của iultragrid đó 
    ''' mặc định iultragrid cho xóa - sửa nhưng không cho thêm dòng
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setGiaoDienVua()
        setGiaoDienCoBan()
        setFormatUltraGrid(Me)
        Me.DisplayLayout.AutoFitStyle = AutoFitStyle.ResizeAllColumns
    End Sub
    ''' <summary>
    ''' Thay đổi giao diện để các cột tùy chỉnh do người thiết kế (thiết kế sao thì hiện lên vậy)
    ''' mặc định iultragrid cho xóa - sửa nhưng không cho thêm dòng
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setGiaoDienTuyBien()
        setGiaoDienCoBan()
        setFormatUltraGrid(Me)
    End Sub
    ''' <summary>
    ''' Tính dòng tổng của cột cần chọn (sẽ có dòng tổng ở cuối cột chọn)
    ''' </summary>
    ''' <param name="tên_Summaries">đặt tên summaries (ví dụ : Tổng cộng, ...)</param>
    ''' <param name="tên_cột">tên cột cần tính tổng</param>
    ''' <remarks></remarks>
    Public Sub setSummaries(ByVal tên_Summaries As String, ByVal tên_cột As String)
        For Each col As UltraGridColumn In Me.DisplayLayout.Bands(0).Columns
            If col.Key.ToUpper = tên_cột.ToUpper Then
                Me.DisplayLayout.Bands(0).Summaries.Add(tên_cột, SummaryType.Sum, Me.DisplayLayout.Bands(0).Columns(tên_cột), SummaryPosition.UseSummaryPositionColumn).DisplayFormat = tên_Summaries & " = {0:##,##0.#}"
            End If
        Next
    End Sub
    ''' <summary>
    ''' Tính dòng tổng của cột cần chọn (sẽ có dòng tổng ở cuối cột chọn)
    ''' </summary>
    ''' <param name="tên_cột">tên cột cần tính tổng</param>
    ''' <remarks></remarks>
    Public Sub setSummaries(ByVal tên_cột As String)
        For Each col As UltraGridColumn In Me.DisplayLayout.Bands(0).Columns
            If col.Key.ToUpper = tên_cột.ToUpper Then
                Me.DisplayLayout.Bands(0).Summaries.Add(tên_cột, SummaryType.Sum, Me.DisplayLayout.Bands(0).Columns(tên_cột), SummaryPosition.UseSummaryPositionColumn).DisplayFormat = "{0:##,##0.#}"
            End If
        Next
    End Sub
    ''' <summary>
    ''' Tính các phương thức khác  của cột cần chọn (bao gồm trung bình,lớn nhất,nhỏ nhất ,....) (sẽ có dòng tính các phương thức ở cuối cột chọn)
    ''' </summary>
    ''' <param name="tên_Summaries">đặt tên summaries (ví dụ : Tổng cộng, trung bình , ...) </param>
    ''' <param name="tên_cột">tên cột cần tính</param>
    ''' <param name="summariestype">chọn các hàm tương ứng để tính phương thức</param>
    ''' <remarks></remarks>
    Public Sub setSummaries(ByVal tên_Summaries As String, ByVal tên_cột As String, ByVal summariestype As SummaryType)
        For Each col As UltraGridColumn In Me.DisplayLayout.Bands(0).Columns
            If col.Key.ToUpper = tên_cột.ToUpper Then
                Me.DisplayLayout.Bands(0).Summaries.Add(summariestype, Me.DisplayLayout.Bands(0).Columns(tên_cột), SummaryPosition.UseSummaryPositionColumn).DisplayFormat = tên_Summaries & " = {0:##,##0.#}"
            End If
        Next
    End Sub
    ''' <summary>
    '''thay đổi giao diện để các cột tự động co dãn theo độ dài dữ liệu
    ''' mặc định iultragrid cho xóa - sửa nhưng không cho thêm dòng
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setGiaoDienTuDong()
        setGiaoDienCoBan()
        setFormatUltraGrid(Me)
        Me.DisplayLayout.Bands(0).PerformAutoResizeColumns(False, PerformAutoSizeType.VisibleRows, True)
    End Sub
    Private Sub setGiaoDienCoBan()
        'thêm thử
        Me.Rows.AddRowModifiedByUser = False
        'end
        Me.DisplayLayout.Override.RowSelectorNumberStyle = RowSelectorNumberStyle.VisibleIndex
        Me.DisplayLayout.Override.RowAlternateAppearance.BackColor = Color.LightCyan
        Me.DisplayLayout.Override.RowSelectorAppearance.ForeColor = Color.Black
        'Me.DisplayLayout.Override.SelectedRowAppearance.BackColor = Color.LimeGreen
        Me.DisplayLayout.Override.SelectedRowAppearance.BackColor = Color.HotPink
        Me.DisplayLayout.Override.SelectedRowAppearance.BackColor2 = Color.White
        Me.DisplayLayout.Override.ActiveCellAppearance.BackColor = Color.LightPink
        'Me.DisplayLayout.Override.ActiveCellAppearance.BackColor2 = Color.White
        Me.DisplayLayout.Override.RowSelectorWidth = 30
        'các thuộc tính thông thường
        'cho sắp xếp các cột khi click lên header mỗi cột
        Me.DisplayLayout.Override.HeaderClickAction = Infragistics.Win.UltraWinGrid.HeaderClickAction.SortMulti
        'cột tự động vừa 
        'me.DisplayLayout.AutoFitStyle = AutoFitStyle.ResizeAllColumns

        Me.DisplayLayout.Override.RowSpacingAfter = 0
        Me.DisplayLayout.Override.RowSpacingBefore = 0
        Me.DisplayLayout.Override.RowSizingAutoMaxLines = 1
        Me.DisplayLayout.Override.HeaderAppearance.TextHAlign = HAlign.Center
        Me.DisplayLayout.Override.RowAppearance.BorderColor = Color.Gray
        'me.UseFlatMode = DefaultableBoolean.True
        'me.DisplayLayout.Override.HeaderAppearance.FontData.Bold = DefaultableBoolean.True
        'Me.DisplayLayout.Override.HeaderAppearance.TextHAlign = HAlign.Center
        'hiển thị lỗi 
        Me.DisplayLayout.Override.SupportDataErrorInfo = UltraWinGrid.SupportDataErrorInfo.RowsAndCells
        Try
            Me.DisplayLayout.Bands(0).Columns(0).SupportDataErrorInfo = DefaultableBoolean.True
        Catch ex As Exception

        End Try

        Me.DisplayLayout.Override.DataErrorCellAppearance.BackColor = Color.Pink
        Me.DisplayLayout.Override.DataErrorRowSelectorAppearance.BackColor = Color.Pink
        Me.DisplayLayout.Override.DataErrorRowAppearance.BackColor = Color.LightYellow
        'hiển thị row filter
        'cho phep copy
        'me.DisplayLayout.Override.AllowMultiCellOperations = AllowMultiCellOperation.All
        'me.DisplayLayout.Override.CellClickAction = CellClickAction.CellSelect
        'me.DisplayLayout.Override.FilterUIType = FilterUIType.FilterRow
        'hiển thị summarises
        Me.DisplayLayout.Override.AllowRowSummaries = AllowRowSummaries.SingleSummary
        Me.DisplayLayout.Override.SummaryFooterCaptionVisible = DefaultableBoolean.False

        Try
            Me.DisplayLayout.Bands(0).Summaries.Add(SummaryType.Count, Me.DisplayLayout.Bands(0).Columns(0), SummaryPosition.Left).DisplayFormat = "Số dòng = {0:##,##0.#}"
        Catch ex As Exception

        End Try
        Me.DisplayLayout.Override.SummaryDisplayArea = SummaryDisplayAreas.BottomFixed
        Try
            Me.DisplayLayout.Bands(0).SummaryFooterCaption = String.Empty
        Catch ex As Exception

        End Try
        'set row active button style
        For Each col As UltraGridColumn In Me.DisplayLayout.Bands(0).Columns
            col.ButtonDisplayStyle = UltraWinGrid.ButtonDisplayStyle.OnRowActivate

        Next
        'set row selecter header
        Me.DisplayLayout.Bands(0).Override.RowSelectorHeaderStyle = RowSelectorHeaderStyle.ColumnChooserButton
        Me.DisplayLayout.Bands(0).Override.RowSelectors = DefaultableBoolean.True
        'set show in chooser in hidden = true
        For Each col As UltraGridColumn In Me.DisplayLayout.Bands(0).Columns
            If col.Hidden Then
                col.ExcludeFromColumnChooser = ExcludeFromColumnChooser.True
            End If
            If col.Hidden = False Then
                col.ExcludeFromColumnChooser = ExcludeFromColumnChooser.False
            End If
            col.ColumnChooserCaption = col.Header.Caption
        Next
        'For index = 0 To Me.DisplayLayout.Bands(0).Columns.Count - 1

        'Next
    End Sub
    ''' <summary>
    ''' Thay đổi giao diện - cho trường hợp iultragrid thông tin - set theo kiểu cardview
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setGiaoDien_Doi_ThongTin()
        Me.setGiaoDienVua()
        ' update
        Me.DisplayLayout.Override.AllowAddNew = AllowAddNew.No
        Me.DisplayLayout.Override.AllowUpdate = DefaultableBoolean.True
        Me.DisplayLayout.Override.AllowDelete = DefaultableBoolean.False
        Me.DisplayLayout.Override.RowAlternateAppearance.BackColor = Color.White
        Me.DisplayLayout.Override.AllowRowSummaries = AllowRowSummaries.False
        Me.DisplayLayout.AutoFitStyle = AutoFitStyle.ResizeAllColumns
        Me.DisplayLayout.Bands(0).CardSettings.CardScrollbars = CardScrollbars.None
        Me.DisplayLayout.Bands(0).CardSettings.AutoFit = True
        'ko sắp xếp các cột khi click lên header mỗi cột
        Me.DisplayLayout.Override.HeaderClickAction = Infragistics.Win.UltraWinGrid.HeaderClickAction.Default
        Me.DisplayLayout.Override.HeaderAppearance.TextHAlign = HAlign.Left
        Me.DisplayLayout.Override.RowSpacingAfter = 0
        Me.DisplayLayout.Override.RowSpacingBefore = 0
        Me.DisplayLayout.Override.RowSizingAutoMaxLines = 0

    End Sub
    ''' <summary>
    ''' Cho phép iultragrid thêm dòng mới, vị trí thêm nằm ở dòng cuối cùng.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setChoPhepThemDong()
        Me.DisplayLayout.Override.AllowAddNew = AllowAddNew.TemplateOnBottom
    End Sub
    ''' <summary>
    ''' Cho phép iultragrid lưu xong thì dòng trống cuối cùng sẽ mất đi 
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setChoPhepLuuXongKhongThemDong()
        Me.LuuXongKhongChoThemDongFlag = True
    End Sub
    ''' <summary>
    ''' Cho phép iultragrid xóa dòng
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setChoPhepXoa()
        Me.DisplayLayout.Override.AllowDelete = DefaultableBoolean.True
    End Sub
    ''' <summary>
    ''' Cho phép iultragrid sửa dữ liệu trên lưới
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setChoPhepSua()
        Me.DisplayLayout.Override.AllowUpdate = DefaultableBoolean.True
    End Sub
    Public Sub setTuyBienUltraGrid()
        M_Config.setDinhDangVietNam()
        Dim rc As Infragistics.Shared.ResourceCustomizer = Infragistics.Win.UltraWinGrid.Resources.Customizer
        ' Customize the text for the Ok MessageBox Button. 
        'rc.SetCustomizedString("MessageBoxButtonOK", "Đồng ý")
        ' Customize the text for the Abort MessageBox Button 
        ' Customize the text for the Retry MessageBox Button 
        rc.SetCustomizedString("MessageBoxButtonRetry", "Try Again")
        rc.SetCustomizedString("DataErrorMessageTitle", "Lỗi nhập liệu !")
        rc.SetCustomizedString("DeleteRowsMessageTitle", "Xóa dữ liệu !")
        rc.SetCustomizedString("DataErrorCellUpdateUnableToUpdateValue", "Bạn đã nhập sai dữ liệu !")
        rc.SetCustomizedString("DeleteSingleRowPrompt", "Bạn có muốn xóa dòng này không ?")
        rc.SetCustomizedString("DeleteMultipleRowsPrompt", "Bạn có muốn xóa những dòng này không ?")
        rc.SetCustomizedString("DataErrorCellUpdateUnableToConvert", "Không thể chuyển đổi từ chuỗi sang số !")
        rc.SetCustomizedString("DataErrorRowUpdateUnableToUpdateRow", "không thể cập nhật dòng dữ liệu vừa thao tác - (có thể một vài cột không cho phép giá trị null) !!!")
        rc.SetCustomizedString("SummaryDialogCount", "Số dòng dữ liệu")
        rc.SetCustomizedString("SummaryDialogSum", "Tổng")
        rc.SetCustomizedString("SummaryDialogAverage", "Trung bình")
        rc.SetCustomizedString("SummaryDialogMaximum", "Lớn nhất")
        rc.SetCustomizedString("SummaryDialogMinimum", "Nhỏ nhất")
        rc.SetCustomizedString("SummaryTypeCount", "Số dòng dữ liệu")
        rc.SetCustomizedString("SummaryTypeSum", "Tổng")
        rc.SetCustomizedString("SummaryTypeAverage", "Trung bình")
        rc.SetCustomizedString("SummaryTypeMaximum", "Lớn nhất")
        rc.SetCustomizedString("SummaryTypeMinimum", "Nhỏ nhất")
        rc.SetCustomizedString("SummaryDialogNone", "(Không chọn hàm)")
        rc.SetCustomizedString("FilterClearButtonToolTip_RowSelector", "Click vào đây để xóa hết các giá trị tìm kiếm trên tất cả các ô ")
        rc.SetCustomizedString("DeleteSingleRowMessageTitle", "xóa một dòng")
        rc.SetCustomizedString("DeleteRowsMessageTitle", "xóa nhiều dòng")
        rc.SetCustomizedString("FilterClearButtonToolTip_FilterCell", "Click vào đây để xóa giá trị tìm kiếm của ô {0}")
        rc.SetCustomizedString("RowFilterDropDown_Operator_Contains", "chứa")
        rc.SetCustomizedString("RowFilterDropDown_Operator_DoesNotContain", "không chứa")
        rc.SetCustomizedString("RowFilterDropDown_Operator_StartsWith", "bắt đầu với")
        rc.SetCustomizedString("RowFilterDropDown_Operator_EndsWith", "kết thúc với")
        rc.SetCustomizedString("RowFilterDropDown_Operator_DoesNotEndWith", "không kết thúc với")
        rc.SetCustomizedString("RowFilterDropDown_Operator_DoesNotMatch", "không trùng với")
        rc.SetCustomizedString("RowFilterDropDown_Operator_DoesNotStartWith", "không bắt đầu với")
        rc.SetCustomizedString("RowFilterDropDownEquals", "bằng")
        rc.SetCustomizedString("RowFilterDropDownGreaterThan", "lớn hơn")
        rc.SetCustomizedString("RowFilterDropDownGreaterThanOrEqualTo", "lớn hơn hoặc bằng")
        rc.SetCustomizedString("RowFilterDropDownLessThan", "nhỏ hơn")
        rc.SetCustomizedString("RowFilterDropDownLessThanOrEqualTo", "nhỏ hơn hoặc bằng")
        rc.SetCustomizedString("RowFilterDropDownLike", "giống")
        rc.SetCustomizedString("RowFilterDropDownMatch", "trùng")
        rc.SetCustomizedString("RowFilterDropDownNotEquals", "không bằng")
        rc.SetCustomizedString("RowFilterDropDown_Operator_NotLike", "không giống")
        rc.SetCustomizedString("LDR_SelectSummaries", "chọn các hàm")
        rc.SetCustomizedString("ColumnChooserDialogCaption", "chọn cột hiển thị")
        rc.SetCustomizedString("ColumnChooserButtonToolTip", "click vào để chọn cột hiển thị")
    End Sub

    ''' <summary>
    ''' bắt focus từ iultragrid này sang iultragrid khác 
    ''' khi nhảy xuống iultragrid khác thì sẽ tạo ra dòng mới (trường hợp iultragrid khác readonly = false)
    ''' </summary>
    ''' <param name="utg"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function setFocusCellUltraGrid(ByVal utg As IUltraGrid) As Boolean
        Me.KeyDownUltraGridNext = utg
        Dim acc As Integer
        Dim list As ArrayList = New ArrayList
        'Me.sCellName = sCell
        'xử lý cell
        'chọn cột đầu tiên hiện ra
        For index As Integer = 0 To utg.DisplayLayout.Bands(0).Columns.Count - 1
            If utg.DisplayLayout.Bands(0).Columns(index).Hidden = False Then
                'sCell = utg.DisplayLayout.Bands(0).Columns(index).Header.VisiblePositionWithinBand
                'sCell = utg.DisplayLayout.Bands(0).Columns(index).Key
                'Me.sCellName = sCell
                'Me.nVisitblePosition = utg.DisplayLayout.Bands(0).Columns(index).Header.VisiblePosition
                ''Exit For
                list.Add(utg.DisplayLayout.Bands(0).Columns(index).Header.VisiblePosition)
            End If
        Next

        For index1 As Integer = 0 To list.Count - 1
            If index1 = 0 Then
                acc = CInt(list.Item(index1))
            End If
            If acc > CInt(list.Item(index1)) Then
                acc = CInt(list.Item(index1))
            End If
        Next
        For index2 As Integer = 0 To utg.DisplayLayout.Bands(0).Columns.Count - 1
            If utg.DisplayLayout.Bands(0).Columns(index2).Header.VisiblePosition = acc Then
                'Me.KeyDownCellStop = utg.DisplayLayout.Bands(0).Columns(index2).Key
            End If
        Next
        'xử lý dropdown
        'Me.isDropDown = isDropDown
        'setFocusCell()
        Me.BeginInvoke(New MethodInvoker(AddressOf setFocusCell))
        Return True
    End Function
    ''' <summary>
    ''' bắt focus từ iultragrid này sang iultragrid khác 
    ''' khi nhảy xuống iultragrid khác thì sẽ không tạo ra dòng mới (trường hợp iultragrid khác readonly = false)
    ''' </summary>
    ''' <param name="utg"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function setFocusCellUltraGridNotNew(ByVal utg As IUltraGrid) As Boolean
        Me.KeyDownUltraGridNext = utg
        Dim acc As Integer
        Dim list As ArrayList = New ArrayList
        'Me.sCellName = sCell
        'xử lý cell
        'chọn cột đầu tiên hiện ra
        For index As Integer = 0 To utg.DisplayLayout.Bands(0).Columns.Count - 1
            If utg.DisplayLayout.Bands(0).Columns(index).Hidden = False Then
                'sCell = utg.DisplayLayout.Bands(0).Columns(index).Header.VisiblePositionWithinBand
                'sCell = utg.DisplayLayout.Bands(0).Columns(index).Key
                'Me.sCellName = sCell
                'Me.nVisitblePosition = utg.DisplayLayout.Bands(0).Columns(index).Header.VisiblePosition
                ''Exit For
                list.Add(utg.DisplayLayout.Bands(0).Columns(index).Header.VisiblePosition)
            End If
        Next

        For index1 As Integer = 0 To list.Count - 1
            If index1 = 0 Then
                acc = CInt(list.Item(index1))
            End If
            If acc > CInt(list.Item(index1)) Then
                acc = CInt(list.Item(index1))
            End If
        Next
        For index2 As Integer = 0 To utg.DisplayLayout.Bands(0).Columns.Count - 1
            If utg.DisplayLayout.Bands(0).Columns(index2).Header.VisiblePosition = acc Then
                'Me.KeyDownCellStop = utg.DisplayLayout.Bands(0).Columns(index2).Key
            End If
        Next
        'xử lý dropdown
        'Me.isDropDown = isDropDown
        'setFocusCell()
        Me.BeginInvoke(New MethodInvoker(AddressOf setFocusCellNotNew))
        Return True
    End Function
    ''' <summary>
    ''' set focus từ ultragrid này qua ultragrid khác ở 1 cell dừng lại nhất định sCellStop
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setFocusCellUltraGrid(ByVal sCellStop As String, ByVal utg As UltraGrid)
        Me.KeyDownUltraGridNext = utg
        Me.KeyDownCellStop = sCellStop
    End Sub
    ''' <summary>
    ''' set focus từ ultragrid này qua ultragrid khác ở 1 cell dừng lại nhất định sCellStop và ko tạo mới dòng setfocus đó
    ''' </summary>
    ''' <param name="sCellStop"></param>
    ''' <param name="utg"></param>
    ''' <remarks></remarks>
    Public Sub setFocusCellUltraGridNotNew(ByVal sCellStop As String, ByVal utg As UltraGrid)
        Me.KeyDownUltraGridNext = utg
        Me.KeyDownCellNotNewStop = sCellStop
    End Sub
    Private Function setFocusCell(ByVal utg As IUltraGrid) As Boolean
        'kiểm tra trạng thái coi có focus ko vì khi readonly = true thì ko 
        If Me.getIsReadonly = False Then
            Me.Focus()
            Me.DisplayLayout.Override.AllowAddNew = AllowAddNew.Yes
            Try
                'MessageBox.Show(sCellName)
                Me.DisplayLayout.Bands(0).AddNew()
                Me.DisplayLayout.Override.AllowAddNew = AllowAddNew.Yes
                Me.DisplayLayout.Override.AllowAddNew = AllowAddNew.TemplateOnBottom
                Me.ActiveCell = Me.Rows(Me.Rows.Count - 1).Cells(Me.getCotDauTien(Me))
                Me.PerformAction(UltraGridAction.ToggleCellSel, False, False)
            Catch ex As Exception
                MessageBox.Show("setfocusCell " & ex.Message)
                Return False
                Exit Function
            End Try
            Try
                Me.PerformAction(UltraGridAction.EnterEditModeAndDropdown, False, False)
            Catch ex As Exception
                Me.PerformAction(UltraGridAction.EnterEditMode, False, False)
            End Try
            Return True
        End If
    End Function
    Private Sub setFocusCell()
        'kiểm tra trạng thái coi có focus ko vì khi readonly = true thì ko 
        If Me.KeyDownUltraGridNext.getIsReadonly = False Then
            Me.KeyDownUltraGridNext.Focus()
            Me.KeyDownUltraGridNext.DisplayLayout.Override.AllowAddNew = AllowAddNew.Yes
            Try
                'MessageBox.Show(sCellName)
                Me.KeyDownUltraGridNext.DisplayLayout.Bands(0).AddNew()
                'Me.KeyDownUltraGridNext.DisplayLayout.Override.AllowAddNew = AllowAddNew.Yes
                Me.KeyDownUltraGridNext.DisplayLayout.Override.AllowAddNew = AllowAddNew.TemplateOnBottom
                Me.KeyDownUltraGridNext.ActiveCell = KeyDownUltraGridNext.Rows(KeyDownUltraGridNext.Rows.Count - 1).Cells(Me.getCotDauTien(Me.KeyDownUltraGridNext))
                Me.KeyDownUltraGridNext.PerformAction(UltraGridAction.ToggleCellSel, False, False)
            Catch ex As Exception
                MessageBox.Show("setfocusCell " & ex.Message)
                Exit Sub
            End Try
            Try
                KeyDownUltraGridNext.PerformAction(UltraGridAction.EnterEditModeAndDropdown, False, False)
            Catch ex As Exception
                KeyDownUltraGridNext.PerformAction(UltraGridAction.EnterEditMode, False, False)
            End Try
        End If
    End Sub
    ''' <summary>
    ''' bắt focus mà ko tạo mới dòng
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setFocusCellNotNew()
        'kiểm tra trạng thái coi có focus ko vì khi readonly = true thì ko 
        If Me.KeyDownUltraGridNext.getIsReadonly = False Then
            Me.KeyDownUltraGridNext.Focus()
            'Me.KeyDownUltraGridNext.DisplayLayout.Override.AllowAddNew = AllowAddNew.Yes
            Try
                'MessageBox.Show(sCellName)
                'Me.KeyDownUltraGridNext.DisplayLayout.Bands(0).AddNew()
                'Me.KeyDownUltraGridNext.DisplayLayout.Override.AllowAddNew = AllowAddNew.Yes
                Me.KeyDownUltraGridNext.DisplayLayout.Override.AllowAddNew = AllowAddNew.TemplateOnBottom
                'Me.KeyDownUltraGridNext.ActiveCell = KeyDownUltraGridNext.Rows(KeyDownUltraGridNext.Rows.Count - 1).Cells(Me.getCotDauTien(Me.KeyDownUltraGridNext))
                Me.KeyDownUltraGridNext.ActiveCell = KeyDownUltraGridNext.Rows(KeyDownUltraGridNext.ActiveRow.Index).Cells(Me.getCotDauTien(Me.KeyDownUltraGridNext))
                Me.KeyDownUltraGridNext.PerformAction(UltraGridAction.ToggleCellSel, False, False)
            Catch ex As Exception
                MessageBox.Show("setfocusCell " & ex.Message)
                Exit Sub
            End Try
            Try
                KeyDownUltraGridNext.PerformAction(UltraGridAction.EnterEditModeAndDropdown, False, False)
            Catch ex As Exception
                KeyDownUltraGridNext.PerformAction(UltraGridAction.EnterEditMode, False, False)
            End Try
        End If
    End Sub
    ''' <summary>
    ''' Kiểm tra trạng thai coi iultragrid đó có readonly không
    ''' </summary>
    ''' <returns>true nếu readonly - false nếu không readonly</returns>
    ''' <remarks></remarks>
    Public Function getIsReadonly() As Boolean
        Return Me.flagReadOnly
    End Function
    ''' <summary>
    ''' iultragrid sẽ readonly (chỉ xem thôi ko chỉnh sửa được)
    ''' </summary>
    ''' <param name="isTRue">true thì iultragrid sẽ ko chỉnh sửa được - false thì chỉnh sửa được</param>
    ''' <remarks></remarks>
    Public Sub setReadonly(ByVal isTRue As Boolean)
        If isTRue Then
            'Disable updating on the entire grid
            Me.DisplayLayout.Override.AllowUpdate = DefaultableBoolean.False
            'Enable updating on the root band. This will override the displayLayout setting
            Me.DisplayLayout.Bands(0).Override.AllowUpdate = DefaultableBoolean.False
            Me.DisplayLayout.Override.AllowAddNew = AllowAddNew.No
            Me.DisplayLayout.Override.AllowDelete = DefaultableBoolean.False
            Me.ContextMenuStrip1.Enabled = False
            Me.flagReadOnly = True 'đang readonly
        Else
            'Disable updating on the entire grid
            Me.DisplayLayout.Override.AllowUpdate = DefaultableBoolean.True
            'Enable updating on the root band. This will override the displayLayout setting
            Me.DisplayLayout.Bands(0).Override.AllowUpdate = DefaultableBoolean.True
            Me.DisplayLayout.Override.AllowAddNew = AllowAddNew.Yes
            Me.DisplayLayout.Override.AllowDelete = DefaultableBoolean.True
            Me.ContextMenuStrip1.Enabled = True
            Me.flagReadOnly = False 'ko readonly
        End If

    End Sub
    ''' <summary>
    ''' Chuyển iultragrid về trạng thái cho chỉnh sửa được
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getSua() As Boolean
        Try
            setReadonly(False)
        Catch ex As Exception
            Return False
        End Try
        Return True
    End Function
    ''' <summary>
    ''' kiểm tra iultragrid có thay đổi dữ liệu không và thoát ra 
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getClose() As Boolean
        Try
            If Me.getCoThayDoiDuLieuKhong Then
                If MessageBox.Show("Có thay đổi dữ liệu, bạn có muốn lưu không ?", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.YesNo, MessageBoxIcon.Error) = DialogResult.Yes Then
                    Me.getLuuNgam()
                    Return True
                End If
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
            Return False
        End Try
    End Function
    Private Function getCotDauTien(ByVal utg As UltraGrid) As String
        'Me.KeyDownUltraGridNext = utg
        Dim acc As Integer
        Dim list As ArrayList = New ArrayList
        Dim sCellDau As String
        'xử lý cell
        'chọn cột đầu tiên hiện ra
        For index As Integer = 0 To utg.DisplayLayout.Bands(0).Columns.Count - 1
            If utg.DisplayLayout.Bands(0).Columns(index).Hidden = False Then
                'sCell = utg.DisplayLayout.Bands(0).Columns(index).Header.VisiblePositionWithinBand
                'sCell = utg.DisplayLayout.Bands(0).Columns(index).Key
                'Me.sCellName = sCell
                'Me.nVisitblePosition = utg.DisplayLayout.Bands(0).Columns(index).Header.VisiblePosition
                ''Exit For
                list.Add(utg.DisplayLayout.Bands(0).Columns(index).Header.VisiblePosition)
            End If
        Next
        For index1 As Integer = 0 To list.Count - 1
            If index1 = 0 Then
                acc = list.Item(index1)
            End If
            If acc > list.Item(index1) Then
                acc = list.Item(index1)
            End If
        Next
        For index2 As Integer = 0 To utg.DisplayLayout.Bands(0).Columns.Count - 1
            If utg.DisplayLayout.Bands(0).Columns(index2).Header.VisiblePosition = acc Then
                sCellDau = utg.DisplayLayout.Bands(0).Columns(index2).Key
                ' Me.KeyDownCellStop = sCellDau
                Return sCellDau
                Exit For
            End If
        Next
        'Me.KeyDownCellStop = sCellDau
        Return sCellDau
    End Function
    ''' <summary>
    ''' set iultragrid tiếp theo nhận focus, ô_dừng_lại_ở_iultraGrid có nghĩa là cell dừng lại ở iultragrid khi nhảy qua iultragrid tiếp theo
    ''' </summary>
    ''' <param name="ô_dừng_lại_ở_iultraGrid">ô dừng lại ở iultragrid</param>
    ''' <param name="utg">iultragrid cần set để focus qua</param>
    ''' <remarks></remarks>
    Public Sub setFocusIUltraGrid(ByVal ô_dừng_lại_ở_iultraGrid As String, ByVal utg As IUltraGrid)
        Me.KeyDownUltraGridNext = utg
        Me.KeyDownCellStop = ô_dừng_lại_ở_iultraGrid
    End Sub
    ''' <summary>
    ''' tắt sự kiện AfterCellListCloseUp (để thực hiện ở lớp con)
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setOffAfterCellListCloseUp()
        Me.AfterCellListCloseUpOn = False
    End Sub
    ''' <summary>
    ''' mở sự kiện AfterCellListCloseUp (để thực hiện ở lớp cha theo mặc định)
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setOnAfterCellListCloseUp()
        Me.AfterCellListCloseUpOn = True
    End Sub
    ''' <summary>
    ''' tắt sự kiện keydown (để thực hiện ở lớp con)
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setOffKeyDown()
        Me.KeyDownOn = False
    End Sub
    ''' <summary>
    ''' mở sự kiện keydown (để thực hiện ở lớp cha theo mặc định)
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setOnKeyDown()
        Me.KeyDownOn = True
    End Sub
    'Public Sub setCotKhongXoXuong(ByVal lst As ArrayList)
    '    Me.KeyDownLst = lst
    'End Sub
    'set danh sách xổ xuống
    ''' <summary>
    ''' Điền vào tên các cột cần xử lý để không cho xổ xuống mỗi khi di chuyển  tới cột đó
    ''' </summary>
    ''' <param name="tên_cột_không_xổ_xuống"> tên cột không xổ xuống (chủ yếu là kiểu date - ngày tháng</param>
    ''' <remarks></remarks>
    Public Sub setCotKhongXoXuong(ByVal tên_cột_không_xổ_xuống As String)
        Me.KeyDownLst.Add(tên_cột_không_xổ_xuống)
    End Sub


    ''' <summary>
    '''keydown để di chuyển qua ô tiếp theo
    ''' </summary>
    ''' <returns>trả về true nếu di chuyển qua ô tiếp theo, false thì không di chuyển</returns>
    ''' <remarks></remarks>
    Public Function getKeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) As Boolean
        'Dim stencot_active As String
        'Dim stencot As String
        'Dim dataType As String
        'Dim sAllowDbNull As String 'có cho phép null hay không ?
        'Dim sUnique As String 'có duy nhất hay không ?
        'Dim sHeader As String 'header tung cot
        'Dim utgColumn As UltraGridColumn
        If Me.KeyDownOn Then
            If e.KeyCode = Keys.Enter Or e.KeyCode = Keys.Next Then
                'Dim ultrawingrid As UltraGrid = CType(sender, UltraGrid)
                If Me.ActiveRow.Index <> -1 Then
                    'xử lý khi bắt focus lên một iultragrid khác
                    'If KeyDownCellStop IsNot Nothing Then
                    '    If Me.ActiveRow.Cells(KeyDownCellStop).IsActiveCell Then
                    '        setFocusCellUltraGrid(Me.KeyDownUltraGridNext)
                    '        'KeyDownCellStop = Nothing
                    '        Return False
                    '    End If
                    'Else

                    'End If
                    'setfocus len ultragrid khac
                    If Me.getIsReadonly = False Then
                        If KeyDownCellStop Is Nothing Then
                        Else
                            If Me.ActiveRow.Cells(Me.KeyDownCellStop).IsActiveCell Then
                                setFocusCellUltraGrid(Me.KeyDownUltraGridNext)
                                'KeyDownCellStop = Nothing
                                Return False
                                Exit Function
                            End If
                        End If

                    End If
                    If Me.getIsReadonly = False Then
                        If KeyDownCellNotNewStop Is Nothing Then
                        Else
                            If Me.ActiveRow.Cells(Me.KeyDownCellNotNewStop).IsActiveCell Then
                                setFocusCellUltraGridNotNew(Me.KeyDownUltraGridNext)
                                'KeyDownCellStop = Nothing
                                Return False
                                Exit Function
                            End If
                        End If
                    End If

                End If
                ''xử lý cho trường hợp nhập giá trị không đúng 
                For index1 As Integer = 0 To obj.getListObjUtilsect.Count - 1 'duyệt tất cả các phần tử
                    Dim iudd As IUltraDropDown
                    Dim data As DataTable
                    Dim sCell As String
                    Try
                        If CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObjectType = ObjUtils._UltraDropDown Then
                            sCell = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getCell 'lấy cell từ đối tượng có ultradropdown
                            'sCellCheck = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObject, UltraDropDown).ValueMember 'lấy value member
                            
                            'kiểm tra coi cell đó là cell nào
                            If Me.ActiveCell.Column.Key = sCell Then
                                iudd = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObject, IUltraDropDown)
                                data = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObj_datatable, DataTable)
                                'If IsDBNull(Me.ActiveCell.Text) Or Me.ActiveCell.Text = "" Or Me.ActiveCell.Text = " " Then
                                '    MessageBox.Show(" Không thể rỗng !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                                '    Return False
                                'Else
                                If obj.getKiemTraItemTrongDatatable(data, Me.ActiveCell.Text, iudd.ValueMember) = False And obj.getKiemTraItemTrongDatatable(data, Me.ActiveCell.Text, iudd.DisplayMember) = False Then 'nếu ko có trong combobox
                                    iudd.SelectedRow = iudd.Rows(0)
                                    iudd.DataSource = data
                                Else
                                    iudd.DataSource = data
                                End If
                                'End If
                                'If obj.getKiemTraItemTrongDatatable(data, utg.ActiveRow.Cells(stencot_active).Value, sCellCheck) = False Then 'nếu ko có trong combobox
                                'MessageBox.Show("'" & sHeader & "' không đúng , bạn phải chọn giá trị khác !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                                'e.Cancel = True
                                'Me.SendKeys.Send("{DOWN}")
                                'Me.KeyActionMappings.Add(
                                'Me.udd.SelectedRow = Me.udd.Rows(0)
                                'Me.PerformAction(UltraGridAction.FirstRowInBand)
                                'CType(udd,IValueList).GetText(
                                'e.Cancel = True
                                'Me.DisplayLayout.Bands(0).Columns(0).de()
                                ''utg.PerformAction(UltraGridAction.NextCell)
                                'Exit Function
                            End If
                        End If
                    Catch ex As Exception
                        'thoát khi trường hợp cell không dropdown đc
                        'Exit Function
                    End Try
                Next
                'If M_Ultragrid.getKiemTraItemTrongDatatable(Me.dataTable, .Text, cboToggleDropDrown.ValueMember) = False Then
                '    cboToggleDropDrown.PerformAction(UltraComboAction.FirstRow)
                '    Return False
                'End If
                Me.PerformAction(Infragistics.Win.UltraWinGrid.UltraGridAction.NextCellByTab)
                'Me.PerformAction(Infragistics.Win.UltraWinGrid.UltraGridAction.NextCell)
                'Me.PerformAction(UltraGridAction.NextCellByTab
                'nếu có ô dừng lại và nhảy qua ultragrid khác
                Try
                    If KeyDownLst.Contains(Me.ActiveCell.Column.Key) Then
                        'ultrawingrid.PerformAction(Infragistics.Win.UltraWinGrid.UltraGridAction.NextCell)
                        Me.PerformAction(Infragistics.Win.UltraWinGrid.UltraGridAction.EnterEditMode)
                        e.Handled = True
                    Else
                        'ultrawingrid.PerformAction(Infragistics.Win.UltraWinGrid.UltraGridAction.NextCell)
                        Me.PerformAction(Infragistics.Win.UltraWinGrid.UltraGridAction.EnterEditModeAndDropdown)
                        e.Handled = True
                    End If
                Catch ex As Exception
                    MessageBox.Show("keydown error" & ex.Message)
                End Try

            Else
                'ultrawingrid.PerformAction(Infragistics.Win.UltraWinGrid.UltraGridAction.EnterEditModeAndDropdown)

                'If e.KeyCode = Keys.Right Then
                '    Me.PerformAction(UltraGridAction.NextCellByTab)
                '    Return True
                'End If
                'If e.KeyCode = Keys.Left Then
                '    Me.PerformAction(UltraGridAction.PrevCellByTab)
                '    Return True
                'End If
                'e.Handled = False
                If e.KeyCode = Keys.ShiftKey Then
                    Try
                        If getContainsSearchtoShift(Me.ActiveCell.Column.Key) Then
                            setTimKiemShift()
                            Return True
                        End If
                    Catch ex As Exception
                        'truong hop cot ko active
                    End Try
                    
                End If
            End If

            '===================================================
          
            ' perform action needed to move cursor
            Select Case e.KeyValue

                Case Keys.Up
                    If getKiemTraCellCoDropDown() = False Then 'nếu không có trong cell dropdown
                        Me.PerformAction(UltraGridAction.ExitEditMode, False, False)
                        Me.PerformAction(UltraGridAction.AboveCell, False, False)
                        e.Handled = True
                        'Return False
                    End If
                Case Keys.Down
                    If getKiemTraCellCoDropDown() = False Then
                        Me.PerformAction(UltraGridAction.ExitEditMode, False, False)
                        Me.PerformAction(UltraGridAction.BelowCell, False, False)
                        e.Handled = True
                        'Return False
                    End If
                Case Keys.Right

                    Me.PerformAction(UltraGridAction.ExitEditMode, False, False)
                    Me.PerformAction(UltraGridAction.NextCellByTab, False, False)
                    e.Handled = True
                    'Return False
                Case Keys.Left
                    Me.PerformAction(UltraGridAction.ExitEditMode, False, False)
                    Me.PerformAction(UltraGridAction.PrevCellByTab, False, False)
                    e.Handled = True
                    'Return False
            End Select
            ''==================================================
            If (e.KeyCode = Keys.Up) Or (e.KeyCode = Keys.Down) Then
                Return False
                '===================
            Else
                Return True
            End If
        End If
    End Function
    Private Function getKiemTraCellCoDropDown() As Boolean
        For index1 As Integer = 0 To obj.getListObjUtilsect.Count - 1 'duyệt tất cả các phần tử
            Dim sCell As String
            'Dim sCellCheck
            'Dim data As DataTable
            Try
                If CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObjectType = ObjUtils._UltraDropDown Then
                    sCell = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getCell 'lấy cell từ đối tượng có ultradropdown
                    'sCellCheck = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObject, UltraDropDown).ValueMember 'lấy value member
                    'data = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObj_datatable, DataTable)
                    If Me.ActiveCell.Column.Key = sCell Then 'nếu có valuelist (ultradropdown)
                        Return True
                        Exit Function
                    End If
                End If
            Catch ex As Exception

            End Try
        Next
        Return False
    End Function
    Private Sub IUltraGrid_AfterCellActivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.AfterCellActivate
        setAfterCellActivate(sender, e)
    End Sub

    Private Sub IUltraGrid_AfterCellListCloseUp(ByVal sender As Object, ByVal e As Infragistics.Win.UltraWinGrid.CellEventArgs) Handles Me.AfterCellListCloseUp
        Me.setAfterCellListCloseUp(sender, e)
    End Sub

    Private Sub IUltraGrid_AfterExitEditMode(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.AfterExitEditMode
        If Me.AfterExitEditModeOn Then
            Me.setAfterExitEditMode()
        End If
    End Sub

    Private Sub IUltraGrid_AfterRowInsert(ByVal sender As Object, ByVal e As Infragistics.Win.UltraWinGrid.RowEventArgs) Handles Me.AfterRowInsert
        setAfterRowInsert(e)
    End Sub

    Private Sub IUltraGrid_BeforeCellDeactivate(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Me.BeforeCellDeactivate
        Me.setBeforeCellDeactivate(sender, e)
    End Sub

    Private Sub IUltraGrid_BeforeEnterEditMode(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Me.BeforeEnterEditMode
        Me.origCellVal = Me.ActiveCell.Value
    End Sub

    Private Sub IUltraGrid_BeforeExitEditMode(sender As Object, e As Infragistics.Win.UltraWinGrid.BeforeExitEditModeEventArgs) Handles Me.BeforeExitEditMode
        'cần kiểm tra trong trường hợp filter để làm cho đúng
        'Dim sHeader As String = Me.ActiveCell.Column.Header.Caption
        'For index1 As Integer = 0 To obj.getListObjUtilsect.Count - 1 'duyệt tất cả các phần tử
        '    Dim sCell As String
        '    Dim sCellCheck
        '    Dim data As DataTable
        '    Try
        '        If CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObjectType = ObjUtils._UltraDropDown Then
        '            sCell = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getCell 'lấy cell từ đối tượng có ultradropdown
        '            sCellCheck = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObject, UltraDropDown).ValueMember 'lấy value member
        '            data = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObj_datatable, DataTable)
        '            If Me.ActiveCell.Column.Key = sCell Then 'nếu có valuelist (ultradropdown)
        '                'kiểm tra
        '                If obj.getKiemTraItemTrongDatatable(data, Me.ActiveRow.Cells(sCell).Value, sCellCheck) = False And Me.ActiveRow.Cells(sCell).IsActiveCell Then 'nếu ko có trong combobox
        '                    'If obj.getKiemTraItemTrongDatatable(data, utg.ActiveRow.Cells(stencot_active).Value, sCellCheck) = False Then 'nếu ko có trong combobox
        '                    MessageBox.Show("'" & sHeader & "' không đúng , bạn phải chọn giá trị khác !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
        '                    e.Cancel = True
        '                    Exit Sub
        '                Else 'trường hợp đúng

        '                End If
        '            End If
        '        End If
        '    Catch ex As Exception
        '        'thoát khi trường hợp cell không dropdown đc
        '        Exit Sub
        '    End Try
        'Next
    End Sub



    Private Sub IUltraGrid_CellChange(ByVal sender As Object, ByVal e As Infragistics.Win.UltraWinGrid.CellEventArgs) Handles Me.CellChange
        setCellChange(sender, e)
    End Sub

    Private Sub IUltraGrid_InitializeRow(ByVal sender As Object, ByVal e As Infragistics.Win.UltraWinGrid.InitializeRowEventArgs) Handles Me.InitializeRow
        'M_Config.setDinhDangVietNam()
        Me.setInitializeRow(sender, e)
    End Sub
    Private Sub IUltraGrid_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        Me.KeyDownFlag = Me.getKeyDown(sender, e)
        If e.KeyCode = (Keys.F12) Then
            openSaveFileXml()
        End If
    End Sub
    Public Sub setKeypress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
        Try
            Dim grid As UltraGrid
            Dim activeCell As UltraGridCell
            If TypeOf sender Is UltraGrid Then
                grid = DirectCast(sender, UltraGrid)
            End If
            If Not grid Is Nothing Then
                activeCell = grid.ActiveCell
            End If
            ' if there is an active cell, its not in edit mode and can enter edit mode
            If Not activeCell Is Nothing AndAlso Not activeCell.IsInEditMode AndAlso activeCell.CanEnterEditMode Then
                ' if the character is not a control character
                If Char.IsControl(e.KeyChar) = False Then
                    ' try to put cell into edit mode
                    grid.PerformAction(UltraGridAction.EnterEditMode)
                    ' if this cell is still active and it is in edit mode...
                    If grid.ActiveCell Is activeCell AndAlso activeCell.IsInEditMode Then
                        ' get its editor
                        Dim editor As EmbeddableEditorBase = grid.ActiveCell.EditorResolved
                        ' if the editor supports selectable text
                        If editor.SupportsSelectableText Then
                            ' select all the text so it can be replaced
                            editor.SelectionStart = 0
                            editor.SelectionLength = editor.TextLength
                            If TypeOf editor Is EditorWithMask Then
                                ' just clear the selected text and let the grid
                                ' forward the keypress to the editor
                                editor.SelectedText = String.Empty
                            Else
                                ' then replace the selected text with the character
                                editor.SelectedText = New String(e.KeyChar, 1)
                                ' mark the event as handled so the grid doesn't process it
                                e.Handled = True
                            End If
                        End If

                    End If
                Else
                    'test trường hợp cell bị readonly
                    grid.PerformAction(UltraGridAction.EnterEditMode)
                End If
            End If
        Catch ex As Exception
            MessageBox.Show("UltraGrid_keyPress event error : " & ex.Message)
        End Try
    End Sub
    Private Sub setFormatUltraGrid(ByVal utg As IUltraGrid)
        Dim dataType As String
        For index As Integer = 0 To utg.Rows.Band.Columns.Count - 1
            dataType = utg.Rows.Band.Columns(index).DataType.ToString
            If (dataType = "System.Double" Or dataType = "System.Decimal" Or dataType = "System.Int16" Or dataType = "System.Int32" Or dataType = "System.Int64") Then
                utg.Rows.Band.Columns(index).CellAppearance.TextHAlign = HAlign.Right
                utg.Rows.Band.Columns(index).CellClickAction = CellClickAction.EditAndSelectText
                utg.Rows.Band.Columns(index).Style = ColumnStyle.Currency
                'utg.Rows.Band.Columns(index).Format = "#,##0"
                'Try
                '    MessageBox.Show(is(.Rows.Band.Columns(index).Format)
                '    'MessageBox.Show(utg.Rows.Band.Columns(index).FormatInfo)
                '    'If utg.Rows.Band.Columns(index).Format = "N2" Or utg.Rows.Band.Columns(index).Format = "n2" Then
                '    'Else
                '    utg.Rows.Band.Columns(index).Format = "N0"
                '    'End If
                'Catch ex As Exception
                '    MessageBox.Show(ex.Message)
                'End Try
            End If
            If (dataType = "System.Int16" Or dataType = "System.Int32" Or dataType = "System.Int64") Then
                utg.Rows.Band.Columns(index).CellAppearance.TextHAlign = HAlign.Right
                utg.Rows.Band.Columns(index).CellClickAction = CellClickAction.EditAndSelectText
                utg.Rows.Band.Columns(index).Style = ColumnStyle.Integer
            End If

            If (dataType = "System.DateTime") Then
                utg.Rows.Band.Columns(index).CellAppearance.TextHAlign = HAlign.Center
            End If
        Next

    End Sub
    Private Sub IUltraGrid_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
        Me.setKeypress(sender, e)
    End Sub
    ''' <summary>
    ''' Thêm datatable cho iultragrid 
    ''' </summary>
    ''' <param name="dt"></param>
    ''' <remarks></remarks>
    Public Sub setDataTable(ByVal dt As DataTable)
        Me.dataTable = dt
    End Sub
    ''' <summary>
    ''' Them tableadapter cho iultragrid
    ''' </summary>
    ''' <param name="adapter"></param>
    ''' <remarks></remarks>
    Public Sub setAdapter(ByVal adapter As Object)
        Me.adapter = adapter
    End Sub
    ''' <summary>
    ''' Thêm bindingsource cho iultragrid
    ''' </summary>
    ''' <param name="binding"></param>
    ''' <remarks></remarks>
    Public Sub setBindingSource(ByVal binding As BindingSource)
        Me.binding = binding
    End Sub
    ''' <summary>
    ''' them dataset cho iultragrid
    ''' </summary>
    ''' <param name="dataset"></param>
    ''' <remarks></remarks>
    Public Sub setDataSet(ByVal dataset As DataSet)
        Me.dataset = dataset
    End Sub
    ''' <summary>
    ''' Thêm các đối tượng cần xử lý đối với dữ liệu 
    ''' </summary>
    ''' <param name="dt">DataTable</param>
    ''' <param name="binding">BindingSource</param>
    ''' <param name="adapter">TableAdapter</param>
    ''' <param name="dataset">DataSet</param>
    ''' <remarks></remarks>
    Public Sub setDoiTuongXuLyDuLieu(ByVal dt As DataTable, ByVal binding As BindingSource, ByVal adapter As Object, ByVal dataset As DataSet)
        Me.dataTable = dt
        Me.binding = binding
        Me.adapter = adapter
        Me.dataset = dataset
    End Sub
    ''' <summary>
    ''' Chỉ định danh sách cột cần bắt lỗi (không cho rỗng)
    ''' </summary>
    ''' <param name="mảng_chứa_các_cột_cần_bắt_lỗi_kiểu_String">có thể truyền vào mảng như sau : Dim array() As String = {"dog", "cat", "fish"} </param>
    ''' <remarks></remarks>
    Public Sub setCotBatLoi(ByVal mảng_chứa_các_cột_cần_bắt_lỗi_kiểu_String As Array) ' 
        Dim lst As ArrayList = New ArrayList(mảng_chứa_các_cột_cần_bắt_lỗi_kiểu_String)
        Me.InitializeRowlstLoi = lst
    End Sub
    ''' <summary>
    ''' chỉ định 1 cột cần bắt lỗi 
    ''' </summary>
    ''' <param name="tên_cột_bắt_lỗi">tên cột cần bắt lỗi</param>
    ''' <remarks></remarks>
    Public Sub setCotBatLoi(ByVal tên_cột_bắt_lỗi As String)
        Me.InitializeRowlstLoi.Add(tên_cột_bắt_lỗi)
    End Sub
    'thêm trường hợp các field cần bắt lỗi
    Public Sub setInitializeRow(ByVal sender As Object, ByVal e As Infragistics.Win.UltraWinGrid.InitializeRowEventArgs)
        Dim dataType As String
        Dim sAllowDbNull As String 'có cho phép null hay không
        Dim sUnique As String 'có duy nhất hay không ?
        Dim utg As UltraGrid = CType(sender, UltraGrid)
        Dim drv As DataRowView = DirectCast(e.Row.ListObject, DataRowView)
        drv.Row.RowError = rowError
        'Dim employee_enumerator As IEnumerator
        'Dim emp As DataColumn
        'employee_enumerator = datatable.Columns.GetEnumerator
        'While (employee_enumerator.MoveNext)
        '    emp = CType(employee_enumerator.Current, DataColumn)
        '    If lst.Contains(lst.Add(emp.ColumnName)) = False Then
        '        lst.Add(emp.ColumnName)
        '    End If
        'End While
        If dataTable IsNot Nothing Then
            For Each col As DataColumn In dataTable.Columns
                stencot = col.ColumnName
                dataType = dataTable.Columns(stencot).DataType.ToString
                sAllowDbNull = dataTable.Columns(stencot).AllowDBNull.ToString
                sUnique = dataTable.Columns(stencot).Unique.ToString
                'set default
                Try 'cho trường hợp dò bên danh sách
                    If dataType = "System.String" Then 'kiểu chuỗi
                        'If DBNull.Value Is e.Row.Cells(stencot).Value Then
                        If (IsDBNull(e.Row.Cells(stencot).Value) And sAllowDbNull = "False") Then
                            rowError = "Dòng dữ liệu bị lỗi"
                            cellError = "Ô dữ liệu bị lỗi"
                            drv.Row.SetColumnError(stencot, cellError)
                        Else
                            rowError = ""
                            cellError = ""
                            drv.Row.SetColumnError(stencot, cellError)
                        End If
                        'If sUnique = "True" Then
                        '    Try
                        '        If New ObjUtils().getKiemTraItemTrongDatatable(dataTable, utg.ActiveRow.Cells(stencot).Value, stencot) Then
                        '            rowError = "Dòng dữ liệu bị lỗi"
                        '            cellError = "Ô dữ liệu bị lỗi"
                        '            drv.Row.SetColumnError(stencot, cellError)
                        '        Else
                        '            rowError = ""
                        '            cellError = ""
                        '            drv.Row.SetColumnError(stencot, cellError)
                        '        End If
                        '    Catch ex As Exception
                        '        MessageBox.Show("InitializeRow :" & ex.Message)
                        '    End Try
                        'End If
                    End If
                Catch ex As Exception
                    Exit Sub
                End Try

                If dataType = "System.DateTime" Then 'kiểu ngày tháng
                    'default value cell
                    'e.Row.Cells(stencot).Column.DefaultCellValue = Date.Now
                    'If (IsDate(e.Row.Cells(stencot).Value) = False And sAllowDbNull = "False") Or (stencot.Equals(lstLoi.Item(indexLst).ToString) And IsDBNull(e.Row.Cells(stencot).Value)) Then
                    If (IsDate(e.Row.Cells(stencot).Value) = False And sAllowDbNull = "False") Then
                        rowError = "Dòng dữ liệu bị lỗi"
                        cellError = "Ô dữ liệu bị lỗi"
                        drv.Row.SetColumnError(stencot, cellError)
                    Else
                        rowError = ""
                        cellError = ""
                        drv.Row.SetColumnError(stencot, cellError)
                    End If
                End If
                If (dataType = "System.Double" Or dataType = "System.Decimal" Or dataType = "System.Int16" Or dataType = "System.Int32" Or dataType = "System.Int64") Then
                    If IsNumeric(e.Row.Cells(stencot).Value) = False And sAllowDbNull = "False" Then
                        rowError = "Dòng dữ liệu bị lỗi"
                        cellError = "Ô dữ liệu bị lỗi"
                        drv.Row.SetColumnError(stencot, cellError)
                    Else
                        rowError = ""
                        cellError = ""
                        drv.Row.SetColumnError(stencot, cellError)
                    End If
                End If
                For indexLst As Integer = 0 To InitializeRowlstLoi.Count - 1
                    If (stencot.Equals(InitializeRowlstLoi.Item(indexLst).ToString)) Then
                        If IsDBNull(e.Row.Cells(stencot).Value) Then
                            rowError = "Dòng dữ liệu bị lỗi"
                            cellError = "Ô dữ liệu bị lỗi"
                            drv.Row.SetColumnError(stencot, cellError)
                        End If
                        'Else
                        '    rowError = ""
                        '    cellError = ""
                        '    drv.Row.SetColumnError(stencot, cellError)
                    End If
                    'kiểm tra tiếp tục các mặc định
                Next
            Next
            'drv.Row.SetColumnError(stencot, cellError)

        End If

    End Sub
    Public Sub setThemCotUnique(ByVal tên_cột_unique As String)
        lstUnique.Add(tên_cột_unique)
    End Sub
    ''' <summary>
    '''hàm tự động bắt lỗi của ultragrid bằng sự kiện BeforeCellDeactivate
    '''hàm sẽ tự động dò kiểu dữ liệu và bắt lỗi khi di chuyển trên lưới
    '''thêm đối số lst ArrayList  để xử lý các cột ngoại lệ (mặc định nothing)
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Public Sub setBeforeCellDeactivate(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)
        Dim utg As UltraGrid = CType(sender, UltraGrid)
        If utg.ActiveRow.Index <> -1 Then
            'ép kiểu
            'Dim utg As UltraGrid = CType(sender, UltraGrid)
            Dim stencot_active As String
            Dim stencot As String
            Dim dataType As String
            Dim sAllowDbNull As String 'có cho phép null hay không ?
            Dim sUnique As String 'có duy nhất hay không ?
            Dim sHeader As String 'header tung cot
            Dim utgColumn As UltraGridColumn
            Try
                'kiểm tra có edit không để bắt lỗi tiếp tục
                'If Me.ActiveCell.is Then
                'lấy giá trị hiện tại
                stencot = Me.ActiveCell.Column.Key
                sHeader = Me.ActiveCell.Column.Header.Caption
                'xử lý trường hợp unique
                If Me.lstUnique.Contains(stencot) Then
                    If New ObjUtils().getKiemTraItemTrongDatatable(Me.dataTable, utg.ActiveRow.Cells(stencot).Value, stencot) Then
                        MessageBox.Show("'" & sHeader & "' đã tồn tại , bạn phải chọn giá trị khác !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                        e.Cancel = True
                        Exit Sub
                    End If
                    If getKiemTraItemTrongUltragrid(Me, Me.ActiveRow.Cells(stencot).Value, stencot) Then
                        MessageBox.Show("'" & sHeader & "' đã tồn tại , bạn phải chọn giá trị khác !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                        e.Cancel = True
                        Exit Sub
                    End If
                Else 'trường hợp thường 
                    'không cho rỗng nếu sAllowDbNull = false
                    sAllowDbNull = dataTable.Columns(stencot).AllowDBNull.ToString
                    If IsDBNull(utg.ActiveRow.Cells(stencot).Value) And sAllowDbNull = "False" Then
                        If IsDBNull(utg.ActiveRow.Cells(stencot).Value) And sAllowDbNull = "False" Then
                            MessageBox.Show("'" & sHeader & "' không thể rỗng !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                            e.Cancel = True
                            Exit Sub
                        End If
                    End If
                    'trường hợp nằm trong danh sách bắt lỗi
                    If Me.InitializeRowlstLoi.Contains(stencot) Then
                        If IsDBNull(utg.ActiveRow.Cells(stencot).Value) Then
                            MessageBox.Show("'" & sHeader & "' không thể rỗng !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                            e.Cancel = True
                            Exit Sub
                        End If
                    End If
                    'trường hợp của ultradropdown
                    'If utg.ActiveRow.Cells(stencot).ValueList IsNot Nothing Then
                    For index1 As Integer = 0 To obj.getListObjUtilsect.Count - 1 'duyệt tất cả các phần tử
                        Dim sCell As String
                        Dim sCellCheck
                        Dim data As DataTable
                        Try
                            If CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObjectType = ObjUtils._UltraDropDown Then
                                sCell = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getCell 'lấy cell từ đối tượng có ultradropdown
                                sCellCheck = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObject, UltraDropDown).ValueMember 'lấy value member

                                If stencot = sCell Then 'nếu có valuelist (ultradropdown)
                                    'kiểm tra
                                    data = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObj_datatable, DataTable)
                                    If obj.getKiemTraItemTrongDatatable(data, utg.ActiveRow.Cells(stencot).Value, sCellCheck) = False And utg.ActiveRow.Cells(stencot).IsActiveCell Then 'nếu ko có trong combobox
                                        'If obj.getKiemTraItemTrongDatatable(data, utg.ActiveRow.Cells(stencot_active).Value, sCellCheck) = False Then 'nếu ko có trong combobox
                                        MessageBox.Show("'" & sHeader & "' không đúng , bạn phải chọn giá trị khác !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                                        e.Cancel = True
                                        'Me.SendKeys.Send("{DOWN}")
                                        'Me.KeyActionMappings.Add(
                                        'Me.udd.SelectedRow = Me.udd.Rows(0)
                                        'Me.PerformAction(UltraGridAction.FirstRowInBand)
                                        'CType(udd,IValueList).GetText(
                                        'e.Cancel = True
                                        'Me.DisplayLayout.Bands(0).Columns(0).de()
                                        ''utg.PerformAction(UltraGridAction.NextCell)
                                        Exit Sub
                                    Else 'trường hợp đúng

                                    End If
                                End If
                            End If
                        Catch ex As Exception
                            'thoát khi trường hợp cell không dropdown đc
                            Exit Sub
                        End Try
                    Next
                End If
                'End If
                'End If
                'kiểm tra cột hiện tại có nằm trong danh sách bắt lỗi hay ko
                'xử lý bắt lỗi
                '1.xử lý cho trường hợp ultradropdown
                '2.xử lý cho trường hợp cell thường

                'For Each col As DataColumn In Me.dataTable.Columns 'duyệt cột của bảng
                '    stencot = col.ColumnName
                '    dataType = dataTable.Columns(stencot).DataType.ToString
                '    sAllowDbNull = dataTable.Columns(stencot).AllowDBNull.ToString
                '    sUnique = dataTable.Columns(stencot).Unique.ToString
                '    'For Each utcol As UltraGridColumn In utg.ActiveRow.Band.Columns
                '    For index As Integer = 0 To utg.ActiveRow.Band.Columns.Count - 1
                '        utgColumn = utg.ActiveRow.Band().Columns(index)
                '        stencot_active = utg.ActiveRow.Cells(stencot).IsActiveCell.ToString
                '        If utgColumn.Hidden = False Then 'chỉ xử lý trên những cột hiện ra , ẩn thì ko 
                '            sHeader = utgColumn.Header.Caption
                '            For indexLst As Integer = 0 To Me.InitializeRowlstLoi.Count - 1
                '                'nếu 
                '                If sUnique = "True" Then 'kiểm tra trong ultragrid
                '                    'If New ObjUtils().getKiemTraItemTrongDatatable(dt, utg.ActiveRow.Cells(stencot).Value, stencot) Then
                '                    '    MessageBox.Show("'" & sHeader & "' đã tồn tại , bạn phải chọn giá trị khác !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                '                    '    e.Cancel = True
                '                    '    Exit For
                '                    'End If
                '                    If getKiemTraItemTrongUltragrid(Me, Me.ActiveRow.Cells(stencot).Value, stencot) Then
                '                        MessageBox.Show("'" & sHeader & "' đã tồn tại , bạn phải chọn giá trị khác !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                '                        e.Cancel = True
                '                        Exit Sub
                '                    End If
                '                End If

                '                If dataType = "System.String" And utgColumn.Key = stencot Then 'kiểu chuỗi
                '                    'nếu null
                '                    If (IsDBNull(utg.ActiveRow.Cells(stencot).Value) And sAllowDbNull = "False" And stencot_active = "True") Or (stencot = Me.InitializeRowlstLoi.Item(indexLst).ToString And sAllowDbNull = "False" And stencot_active = "True" And (utg.ActiveRow.Cells(stencot).Value.Equals(""))) Then
                '                        MessageBox.Show("'" & sHeader & "' không thể rỗng !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                '                        e.Cancel = True
                '                        Exit Sub
                '                    End If
                '                    For index1 As Integer = 0 To obj.getListObjUtilsect.Count - 1 'duyệt tất cả các phần tử
                '                        Dim sCell As String
                '                        Dim sCellCheck
                '                        Dim data As DataTable
                '                        Try
                '                            If CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObjectType = ObjUtils._UltraDropDown Then
                '                                sCell = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getCell 'lấy cell từ đối tượng có ultradropdown
                '                                sCellCheck = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObject, UltraDropDown).ValueMember 'lấy value member
                '                                data = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObj_datatable, DataTable)
                '                                If stencot = sCell Then 'nếu có valuelist (ultradropdown)
                '                                    'kiểm tra
                '                                    If obj.getKiemTraItemTrongDatatable(data, utg.ActiveRow.Cells(stencot).Value, sCellCheck) = False And utg.ActiveRow.Cells(stencot).IsActiveCell Then 'nếu ko có trong combobox
                '                                        'If obj.getKiemTraItemTrongDatatable(data, utg.ActiveRow.Cells(stencot_active).Value, sCellCheck) = False Then 'nếu ko có trong combobox
                '                                        MessageBox.Show("'" & sHeader & "' không đúng , bạn phải chọn giá trị khác !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                '                                        e.Cancel = True
                '                                        'Me.SendKeys.Send("{DOWN}")
                '                                        'Me.KeyActionMappings.Add(
                '                                        'Me.udd.SelectedRow = Me.udd.Rows(0)
                '                                        'Me.PerformAction(UltraGridAction.FirstRowInBand)
                '                                        'CType(udd,IValueList).GetText(
                '                                        'e.Cancel = True
                '                                        'Me.DisplayLayout.Bands(0).Columns(0).de()
                '                                        ''utg.PerformAction(UltraGridAction.NextCell)
                '                                        Exit Sub
                '                                    End If
                '                                End If
                '                            End If
                '                        Catch ex As Exception
                '                            'thoát khi trường hợp cell không dropdown đc
                '                            Exit Sub
                '                        End Try
                '                    Next
                '                End If
                '                'nếu unique thì tiếp tục kiểm tra cho trường hợp mã
                '                '1.phải duy nhất trong datatable 
                '                '2.không được chứa các ký tự đặc biệt

                '                'nếu là valuelist (chỉ là ultradropdown) thì phải xử lý kiểm tra nó
                '                'phải là giá trị nằm trong datatable của ultradropdown

                '                sHeader = utgColumn.Header.Caption
                '                If dataType = "System.DateTime" And utgColumn.Key = stencot And stencot_active = "True" Then 'kiểu chuỗi
                '                    If IsDBNull(utg.ActiveRow.Cells(stencot).Value) And sAllowDbNull = "False" Then
                '                        If IsDBNull(utg.ActiveRow.Cells(stencot).Value) And sAllowDbNull = "False" Then
                '                            MessageBox.Show("'" & sHeader & "' không thể rỗng !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                '                            e.Cancel = True
                '                            Exit Sub
                '                        End If
                '                    Else

                '                    End If
                '                    'nếu unique thì tiếp tục kiểm tra cho trường hợp mã
                '                    '1.phải duy nhất
                '                    '2.không được chứa các ký tự đặc biệt
                '                End If
                '                If (dataType = "System.Double" Or dataType = "System.Decimal" Or dataType = "System.Int16" Or dataType = "System.Int32" Or dataType = "System.Int64") And utgColumn.Key = stencot And stencot_active = "True" Then 'kiểu chuỗi
                '                    If IsDBNull(utg.ActiveRow.Cells(stencot).Value) And sAllowDbNull = "False" Then
                '                        If IsDBNull(utg.ActiveRow.Cells(stencot).Value) And sAllowDbNull = "False" Then
                '                            MessageBox.Show("'" & sHeader & "' không thể rỗng !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                '                            e.Cancel = True
                '                            Exit Sub
                '                        End If
                '                    Else

                '                    End If
                '                    'nếu unique thì tiếp tục kiểm tra cho trường hợp mã
                '                    '1.phải duy nhất
                '                    '2.không được chứa các ký tự đặc biệt
                '                End If
                '                For index11 As Integer = 0 To InitializeRowlstLoi.Count - 1
                '                    If (stencot.Equals(InitializeRowlstLoi.Item(index11).ToString)) Then
                '                        If (IsDBNull(utg.ActiveRow.Cells(stencot).Value) And stencot_active = "True") Then
                '                            sHeader = utg.ActiveRow.Cells(stencot).Column.Header.Caption
                '                            MessageBox.Show("'" & sHeader & "' không thể rỗng !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                '                            e.Cancel = True
                '                            Exit Sub
                '                        End If
                '                    End If
                '                    'kiểm tra tiếp tục các mặc định
                '                Next
                '            Next
                '            'kiểm tra với trường hợp ko có lstLoi
                '            '=================================
                '            If sUnique = "True" Then 'kiểm tra trong ultragrid
                '                'If New ObjUtils().getKiemTraItemTrongDatatable(dt, utg.ActiveRow.Cells(stencot).Value, stencot) Then
                '                '    MessageBox.Show("'" & sHeader & "' đã tồn tại , bạn phải chọn giá trị khác !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                '                '    e.Cancel = True
                '                '    Exit For
                '                'End If
                '                '=========================================test thử 23/02/2012============================
                '                If dataType = "System.String" And utgColumn.Key = stencot Then 'kiểu chuỗi
                '                    'nếu null
                '                    If (IsDBNull(utg.ActiveRow.Cells(stencot).Value) And sAllowDbNull = "False" And stencot_active = "True") Then
                '                        MessageBox.Show("'" & sHeader & "' không thể rỗng !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                '                        e.Cancel = True
                '                        Exit Sub
                '                    End If
                '                    'nếu 

                '                    For index1 As Integer = 0 To obj.getListObjUtilsect.Count - 1 'duyệt tất cả các phần tử
                '                        Dim sCell As String
                '                        Dim sCellCheck
                '                        Dim data As DataTable
                '                        Try
                '                            If CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObjectType = ObjUtils._UltraDropDown Then
                '                                sCell = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getCell 'lấy cell từ đối tượng có ultradropdown
                '                                sCellCheck = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObject, UltraDropDown).ValueMember 'lấy value member
                '                                data = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObj_datatable, DataTable)
                '                                If stencot = sCell Then 'nếu có valuelist (ultradropdown)
                '                                    'kiểm tra
                '                                    If obj.getKiemTraItemTrongDatatable(data, utg.ActiveRow.Cells(stencot).Value, sCellCheck) = False And utg.ActiveRow.Cells(stencot).IsActiveCell Then 'nếu ko có trong combobox
                '                                        'If obj.getKiemTraItemTrongDatatable(data, utg.ActiveRow.Cells(stencot_active).Value, sCellCheck) = False Then 'nếu ko có trong combobox
                '                                        MessageBox.Show("'" & sHeader & "' không đúng , bạn phải chọn giá trị khác !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                '                                        e.Cancel = True
                '                                        'Me.SendKeys.Send("{DOWN}")
                '                                        'Me.KeyActionMappings.Add(
                '                                        'Me.udd.SelectedRow = Me.udd.Rows(0)
                '                                        'Me.PerformAction(UltraGridAction.FirstRowInBand)
                '                                        'CType(udd,IValueList).GetText(
                '                                        'e.Cancel = True
                '                                        'Me.DisplayLayout.Bands(0).Columns(0).de()
                '                                        ''utg.PerformAction(UltraGridAction.NextCell)
                '                                        Exit Sub
                '                                    End If
                '                                End If
                '                            End If
                '                        Catch ex As Exception
                '                            'thoát khi trường hợp cell không dropdown đc
                '                            Exit Sub
                '                        End Try
                '                    Next
                '                End If
                '                'nếu unique thì tiếp tục kiểm tra cho trường hợp mã
                '                '1.phải duy nhất trong datatable 
                '                '2.không được chứa các ký tự đặc biệt

                '                'nếu là valuelist (chỉ là ultradropdown) thì phải xử lý kiểm tra nó
                '                'phải là giá trị nằm trong datatable của ultradropdown

                '                sHeader = utgColumn.Header.Caption
                '                If dataType = "System.DateTime" And utgColumn.Key = stencot And stencot_active = "True" Then 'kiểu chuỗi
                '                    If IsDBNull(utg.ActiveRow.Cells(stencot).Value) And sAllowDbNull = "False" Then
                '                        If IsDBNull(utg.ActiveRow.Cells(stencot).Value) And sAllowDbNull = "False" Then
                '                            MessageBox.Show("'" & sHeader & "' không thể rỗng !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                '                            e.Cancel = True
                '                            Exit Sub
                '                        End If
                '                    Else

                '                    End If
                '                    'nếu unique thì tiếp tục kiểm tra cho trường hợp mã
                '                    '1.phải duy nhất
                '                    '2.không được chứa các ký tự đặc biệt
                '                End If
                '                If (dataType = "System.Double" Or dataType = "System.Decimal" Or dataType = "System.Int16" Or dataType = "System.Int32" Or dataType = "System.Int64") And utgColumn.Key = stencot And stencot_active = "True" Then 'kiểu chuỗi
                '                    If IsDBNull(utg.ActiveRow.Cells(stencot).Value) And sAllowDbNull = "False" Then
                '                        If IsDBNull(utg.ActiveRow.Cells(stencot).Value) And sAllowDbNull = "False" Then
                '                            MessageBox.Show("'" & sHeader & "' không thể rỗng !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                '                            e.Cancel = True
                '                            Exit Sub
                '                        End If
                '                    Else

                '                    End If
                '                    'nếu unique thì tiếp tục kiểm tra cho trường hợp mã
                '                    '1.phải duy nhất
                '                    '2.không được chứa các ký tự đặc biệt
                '                End If
                '                '========================================================================================
                '                If getKiemTraItemTrongUltragrid(utg, utg.ActiveRow.Cells(stencot).Value, stencot) Then
                '                    MessageBox.Show("'" & sHeader & "' đã tồn tại , bạn phải chọn giá trị khác !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                '                    e.Cancel = True
                '                    Exit Sub
                '                End If
                '            End If

                '            If dataType = "System.String" And utgColumn.Key = stencot Then 'kiểu chuỗi
                '                'nếu null
                '                If (IsDBNull(utg.ActiveRow.Cells(stencot).Value) And sAllowDbNull = "False" And stencot_active = "True") Then
                '                    MessageBox.Show("'" & sHeader & "' không thể rỗng !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                '                    e.Cancel = True
                '                    Exit Sub
                '                End If
                '                'nếu 

                '                For index1 As Integer = 0 To obj.getListObjUtilsect.Count - 1 'duyệt tất cả các phần tử
                '                    Dim sCell As String
                '                    Dim sCellCheck
                '                    Dim data As DataTable
                '                    Try
                '                        If CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObjectType = ObjUtils._UltraDropDown Then
                '                            sCell = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getCell 'lấy cell từ đối tượng có ultradropdown
                '                            sCellCheck = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObject, UltraDropDown).ValueMember 'lấy value member
                '                            data = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObj_datatable, DataTable)
                '                            If stencot = sCell Then 'nếu có valuelist (ultradropdown)
                '                                'kiểm tra
                '                                If obj.getKiemTraItemTrongDatatable(data, utg.ActiveRow.Cells(stencot).Value, sCellCheck) = False And utg.ActiveRow.Cells(stencot).IsActiveCell Then 'nếu ko có trong combobox
                '                                    'If obj.getKiemTraItemTrongDatatable(data, utg.ActiveRow.Cells(stencot_active).Value, sCellCheck) = False Then 'nếu ko có trong combobox
                '                                    MessageBox.Show("'" & sHeader & "' không đúng , bạn phải chọn giá trị khác !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                '                                    e.Cancel = True
                '                                    'Me.SendKeys.Send("{DOWN}")
                '                                    'Me.KeyActionMappings.Add(
                '                                    'Me.udd.SelectedRow = Me.udd.Rows(0)
                '                                    'Me.PerformAction(UltraGridAction.FirstRowInBand)
                '                                    'CType(udd,IValueList).GetText(
                '                                    'e.Cancel = True
                '                                    'Me.DisplayLayout.Bands(0).Columns(0).de()
                '                                    ''utg.PerformAction(UltraGridAction.NextCell)
                '                                    Exit Sub
                '                                End If
                '                            End If
                '                        End If
                '                    Catch ex As Exception
                '                        'thoát khi trường hợp cell không dropdown đc
                '                        Exit Sub
                '                    End Try
                '                Next
                '            End If
                '            'nếu unique thì tiếp tục kiểm tra cho trường hợp mã
                '            '1.phải duy nhất trong datatable 
                '            '2.không được chứa các ký tự đặc biệt

                '            'nếu là valuelist (chỉ là ultradropdown) thì phải xử lý kiểm tra nó
                '            'phải là giá trị nằm trong datatable của ultradropdown

                '            sHeader = utgColumn.Header.Caption
                '            If dataType = "System.DateTime" And utgColumn.Key = stencot And stencot_active = "True" Then 'kiểu chuỗi
                '                If IsDBNull(utg.ActiveRow.Cells(stencot).Value) And sAllowDbNull = "False" Then
                '                    If IsDBNull(utg.ActiveRow.Cells(stencot).Value) And sAllowDbNull = "False" Then
                '                        MessageBox.Show("'" & sHeader & "' không thể rỗng !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                '                        e.Cancel = True
                '                        Exit Sub
                '                    End If
                '                Else

                '                End If
                '                'nếu unique thì tiếp tục kiểm tra cho trường hợp mã
                '                '1.phải duy nhất
                '                '2.không được chứa các ký tự đặc biệt
                '            End If
                '            If (dataType = "System.Double" Or dataType = "System.Decimal" Or dataType = "System.Int16" Or dataType = "System.Int32" Or dataType = "System.Int64") And utgColumn.Key = stencot And stencot_active = "True" Then 'kiểu chuỗi
                '                If IsDBNull(utg.ActiveRow.Cells(stencot).Value) And sAllowDbNull = "False" Then
                '                    If IsDBNull(utg.ActiveRow.Cells(stencot).Value) And sAllowDbNull = "False" Then
                '                        MessageBox.Show("'" & sHeader & "' không thể rỗng !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                '                        e.Cancel = True
                '                        Exit Sub
                '                    End If
                '                Else

                '                End If
                '                'nếu unique thì tiếp tục kiểm tra cho trường hợp mã
                '                '1.phải duy nhất
                '                '2.không được chứa các ký tự đặc biệt
                '            End If
                '            For index11 As Integer = 0 To InitializeRowlstLoi.Count - 1
                '                If (stencot.Equals(InitializeRowlstLoi.Item(index11).ToString)) Then
                '                    If (IsDBNull(utg.ActiveRow.Cells(stencot).Value) And stencot_active = "True") Then
                '                        sHeader = utg.ActiveRow.Cells(stencot).Column.Header.Caption
                '                        MessageBox.Show("'" & sHeader & "' không thể rỗng !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                '                        e.Cancel = True
                '                        Exit Sub
                '                    End If
                '                End If
                '                'kiểm tra tiếp tục các mặc định
                '            Next
                '            '=================================
                '        End If
                '    Next
                'Next
            Catch ex As Exception
                Exit Sub
            End Try

        End If
    End Sub
    ''' <summary>
    ''' kiểm tra coi row active có giá trị đúng ko (trường hợp ultradropdown) - chưa kiểm tra xong
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function checkRowActiveUltraGrid() As Boolean
        Dim utgColumn As UltraGridColumn
        Dim sHeader As String
        For index As Integer = 0 To Me.ActiveRow.Band.Columns.Count - 1
            utgColumn = Me.ActiveRow.Band().Columns(index)
            If utgColumn.Hidden = False Then 'chỉ xử lý trên những cột hiện ra , ẩn thì ko 
                sHeader = utgColumn.Header.Caption
            End If
            For index1 As Integer = 0 To obj.getListObjUtilsect.Count - 1 'duyệt tất cả các phần tử
                Dim sCell As String
                Dim sCellCheck
                Dim data As DataTable
                Try
                    If CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObjectType = ObjUtils._UltraDropDown Then
                        sCell = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getCell 'lấy cell từ đối tượng có ultradropdown
                        sCellCheck = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObject, UltraDropDown).ValueMember 'lấy value member
                        data = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObj_datatable, DataTable)
                        If stencot = sCell Then 'nếu có valuelist (ultradropdown)
                            'kiểm tra
                            If obj.getKiemTraItemTrongDatatable(data, Me.ActiveRow.Cells(stencot).Value, sCellCheck) = False And Me.ActiveRow.Cells(stencot).IsActiveCell Then 'nếu ko có trong combobox
                                'If obj.getKiemTraItemTrongDatatable(data, utg.ActiveRow.Cells(stencot_active).Value, sCellCheck) = False Then 'nếu ko có trong combobox
                                MessageBox.Show("'" & sHeader & "' không đúng , bạn phải chọn giá trị khác !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)

                                'Me.SendKeys.Send("{DOWN}")
                                'Me.KeyActionMappings.Add(
                                'Me.udd.SelectedRow = Me.udd.Rows(0)
                                'Me.PerformAction(UltraGridAction.FirstRowInBand)
                                'CType(udd,IValueList).GetText(
                                'e.Cancel = True
                                'Me.DisplayLayout.Bands(0).Columns(0).de()
                                ''utg.PerformAction(UltraGridAction.NextCell)
                                Return False
                                Exit Function
                            End If
                        End If
                    End If
                Catch ex As Exception
                    'thoát khi trường hợp cell không dropdown đc
                    Exit Function
                End Try
            Next
        Next
        Return True
    End Function
    ''' <summary>
    '''Hiển thị rowfilter là một dòng tìm kiếm tất cả các cột trên iultragrid
    '''nó sẽ tự động set phương thức tìm kiếm cho phù hợp trên từng cột
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setTimKiemTrenCotUltraGrid()
        Me.DisplayLayout.Override.AllowRowFiltering = DefaultableBoolean.True
        Me.DisplayLayout.Override.FilterUIType = FilterUIType.FilterRow
        Me.DisplayLayout.Override.FilterOperandDropDownItems = FilterOperandDropDownItems.CellValues
        Me.DisplayLayout.Override.FilterEvaluationTrigger = FilterEvaluationTrigger.OnCellValueChange
        'me.DisplayLayout.Override.FilterOperatorDefaultValue = _
        '  FilterOperatorDefaultValue.DoesNotContain
        For index As Integer = 0 To Me.Rows.Band.Columns.Count - 1
            If (Me.Rows.Band.Columns(index).DataType.FullName.ToString = "System.DateTime") Or (Me.Rows.Band.Columns(index).DataType.FullName.ToString = "System.Double") Or (Me.Rows.Band.Columns(index).DataType.FullName.ToString = "system.Decimal") Or (Me.Rows.Band.Columns(index).DataType.FullName.ToString = "system.Int16") Or (Me.Rows.Band.Columns(index).DataType.FullName.ToString = "system.Int32") Or (Me.Rows.Band.Columns(index).DataType.FullName.ToString = "system.Int64") Then
                Try
                    Me.Rows.Band.Columns(index).FilterOperatorDefaultValue = FilterOperatorDefaultValue.Equals
                    Me.Rows.Band.Columns(index).FilterOperandStyle = FilterOperandStyle.Combo
                Catch ex As Exception
                    MessageBox.Show("lỗi 'setTimKiemTrenCotme' !!!")
                End Try
            Else
                Me.Rows.Band.Columns(index).FilterOperatorDefaultValue = FilterOperatorDefaultValue.Contains
            End If
        Next
    End Sub
    Public Sub setFilterBindingSource(ByVal sColumn As String, ByVal sValue As String)
        Me.binding.Filter = sColumn & " ='" & sValue & "'"
    End Sub
    ''' <summary>
    ''' Di chuyển tới record cuối cùng (thường set ở iultragrid của phần thông tin - cardview)
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setMoveLast()
        Me.binding.MoveLast()
        If Me.Rows.Count > 0 Then
            Me.ActiveRowScrollRegion.ScrollRowIntoView(Me.Rows(Me.Rows.Count - 1))
        End If
    End Sub
    ''' <summary>
    ''' tạo rowfilter trên iultragrid 
    '''  </summary>
    ''' <param name="lst">có một danh sách chứa các cột cần tìm kiếm theo phương thức contains - không quan tâm tới kiểu dữ liệu</param>
    ''' <remarks></remarks>
    Public Sub setTimKiemTrenCotUltraGrid(ByVal lst As ArrayList)
        Me.DisplayLayout.Override.FilterUIType = FilterUIType.FilterRow
        Me.DisplayLayout.Override.FilterOperandDropDownItems = FilterOperandDropDownItems.CellValues
        Me.DisplayLayout.Override.FilterEvaluationTrigger = FilterEvaluationTrigger.OnCellValueChange
        Dim scolumnname As String
        For index As Integer = 0 To Me.Rows.Band.Columns.Count - 1
            If (Me.Rows.Band.Columns(index).DataType.FullName.ToString = "System.DateTime") Or (Me.Rows.Band.Columns(index).DataType.FullName.ToString = "System.Double") Or (Me.Rows.Band.Columns(index).DataType.FullName.ToString = "system.Decimal") Or (Me.Rows.Band.Columns(index).DataType.FullName.ToString = "system.Int16") Or (Me.Rows.Band.Columns(index).DataType.FullName.ToString = "system.Int32") Or (Me.Rows.Band.Columns(index).DataType.FullName.ToString = "system.Int64") Then
                Try
                    Me.Rows.Band.Columns(index).FilterOperatorDefaultValue = FilterOperatorDefaultValue.Equals
                    Me.Rows.Band.Columns(index).FilterOperandStyle = FilterOperandStyle.Combo
                Catch ex As Exception
                    MessageBox.Show("lỗi 'setTimKiemTrenCotUltraGrid' !!!")
                End Try
                For index1 As Integer = 0 To lst.Count - 1
                    scolumnname = lst.Item(index1).ToString
                    'kiểm tra có trong danh sách thì cho nó contains
                    If (Me.Rows.Band.Columns(index).Key = scolumnname) Then
                        Me.Rows.Band.Columns(index).FilterOperatorDefaultValue = FilterOperatorDefaultValue.Contains
                    End If
                Next
            Else
                Me.Rows.Band.Columns(index).FilterOperatorDefaultValue = FilterOperatorDefaultValue.Contains
            End If
        Next
    End Sub
    Public Sub setAfterCellActivate(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim utg As IUltraGrid = CType(sender, IUltraGrid)
        If utg.ActiveRow.Index <> -1 Then
            Dim data As DataTable
            Dim sCell As String
            Dim udd As IUltraDropDown
            For index1 As Integer = 0 To obj.getListObjUtilsect.Count - 1
                If CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObjectType = ObjUtils._UltraDropDown Then
                    sCell = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getCell

                    If utg.ActiveRow.Cells.Exists(sCell) Then 'có cell thì tiếp tục - dùng cho nhiều ultragrid
                        If utg.ActiveRow.Cells(sCell).IsActiveCell Then
                            If utg.PerformAction(UltraGridAction.EnterEditModeAndDropdown) = True Then
                                data = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObj_datatable, DataTable)
                                udd = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObject
                                udd.DataSource = data
                                'Me.udd = udd
                            End If
                        End If
                    End If
                End If
            Next
        End If
    End Sub
    '
    Public Sub setAfterRowInsert(ByVal e As Infragistics.Win.UltraWinGrid.RowEventArgs)
        'Dim dataType As String
        'Dim sAllowDbNull As String 'có cho phép null hay không
        'Dim sUnique As String 'có duy nhất hay không ?
        Dim Item As DictionaryEntry
        For Each col As DataColumn In dataTable.Columns
            stencot = col.ColumnName
            'dataType = dt.Columns(stencot).DataType.ToString
            'sAllowDbNull = dt.Columns(stencot).AllowDBNull.ToString
            'sUnique = dt.Columns(stencot).Unique.ToString
            'set default value in column
            For Each Item In htMacDinh
                If Item.Key = stencot Then
                    Try
                        e.Row.Cells(stencot).Value = Item.Value
                    Catch ex As Exception
                        MessageBox.Show(ex.Message)
                    End Try
                    'Exit For
                End If
            Next
        Next
    End Sub
    Public Sub setCellChange(ByVal sender As Object, ByVal e As Infragistics.Win.UltraWinGrid.CellEventArgs)
        If Me.getContainsSearchtoShift(Me.ActiveCell.Column.Key) = False Then
            Dim utg As IUltraGrid = CType(sender, IUltraGrid)
            Dim data As DataTable
            Dim sCell As String
            Dim udd As UltraDropDown
            For index1 As Integer = 0 To obj.getListObjUtilsect.Count - 1
                'sCell = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getCell
                'If sCell IsNot Nothing Then
                'data = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObj_datatable, DataTable)
                If CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObjectType = ObjUtils._UltraDropDown Then
                    sCell = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getCell
                    If utg.ActiveRow.Cells.Exists(sCell) Then 'kiểm tra cell có tồn tại ko - trường hợp nhiều ultragrid
                        'bổ sung trường hợp đang active cell thì dropdown
                        If utg.ActiveRow.Cells(sCell).IsActiveCell And utg.ActiveRow.Cells(sCell).DroppedDown = False Then
                            utg.PerformAction(UltraGridAction.ToggleDropdown)
                        End If
                        If utg.ActiveRow.Cells(sCell).IsActiveCell And Me.KeyDownFlag Then
                            udd = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObject
                            data = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObj_datatable, DataTable)
                            'utg.DisplayLayout.Bands(0).Columns(sCell).AutoCompleteMode = AutoCompleteMode.None
                            'udd.DisplayLayout.Bands(0).Columns(udd.ValueMember).AutoCompleteMode = AutoCompleteMode.None
                            'If sColumFilter IsNot Nothing Then
                            setUltraDropDownTimKiemNhanh(data, udd, utg.ActiveRow.Cells(sCell).Text.Trim.ToString)
                            'End If
                        End If
                    End If
                End If
                'Else
                'Exit Sub
                'End If
            Next
            'Else
            '    Me.setTimKiemShift()
        End If
    End Sub
    Private Function getViewSQL(ByVal dt As DataTable, ByVal svalue As String) As String
        Dim sql As String = ""
        For index As Integer = 0 To dt.Columns.Count - 1
            Try
                'If Me.sColumFilter IsNot Nothing Then
                '    sql += dt.Columns.Item(index).ColumnName & " = '" & Me.sValueFilter & "' and "

                'End If
                If (dt.Columns.Item(index).DataType.ToString = "System.DateTime") Or (dt.Columns.Item(index).DataType.ToString = "System.Date") Then
                    If IsDate(svalue) Then
                        sql += dt.Columns.Item(index).ColumnName & " = '" & Format(CDate(svalue), "yyyy-MM-dd") & "' or "
                    Else
                        sql += "CONVERT(" & dt.Columns.Item(index).ColumnName & ", System.String) LIKE '%" & svalue & "%' or "
                    End If
                    'sql += dt.Columns.Item(index).ColumnName & " like '" & Format(CDate(svalue), "yyyy-MM-dd") & "' or like'%" & "CONVERT(" & CDate(svalue) & ",'System.String')" & "%' or "
                    'sql += dt.Columns.Item(index).ColumnName & " like'%" & " CONVERT(" & Format(CDate(svalue), "dd/MM/yyyy") & ",System.String)" & "%' or "
                    'Else
                    '    sql += dt.Columns.Item(index).ColumnName & " = '" & Me.sValueFilter & "' or "
                End If
                'MessageBox.Show(sql)
                'End If

                If (dt.Columns.Item(index).DataType.ToString = "System.Double") Or (dt.Columns.Item(index).DataType.ToString = "System.Decimal") Or (dt.Columns.Item(index).DataType.ToString = "System.Int16") Or (dt.Columns.Item(index).DataType.ToString = "System.Int32") Or (dt.Columns.Item(index).DataType.ToString = "System.Int64") Then
                    If IsNumeric(svalue) Then
                        sql += dt.Columns.Item(index).ColumnName & " = " & svalue & " or "
                    Else
                        sql += "CONVERT(" & dt.Columns.Item(index).ColumnName & ", System.String) LIKE '%" & svalue & "%' or "
                    End If
                    'sql += dt.Columns.Item(index).ColumnName & " = " & svalue & " or "
                End If
                'End If
                'If IsNumeric(svalue) = False And IsDate(svalue) = False Then
                If (dt.Columns.Item(index).DataType.ToString = "System.String") Then
                    sql += dt.Columns.Item(index).ColumnName & " like '%" & svalue & "%' or "
                End If

                'Else
                '    If (dt.Columns.Item(index).DataType.ToString = "System.DateTime") Or (dt.Columns.Item(index).DataType.ToString = "System.Date") Then
                '        If IsDate(svalue) Then
                '            sql += dt.Columns.Item(index).ColumnName & " = '" & Format(CDate(svalue), "yyyy-MM-dd") & "' or "
                '        Else
                '            sql += "CONVERT(" & dt.Columns.Item(index).ColumnName & ", System.String) LIKE '%" & svalue & "%' or "
                '        End If
                '        'sql += dt.Columns.Item(index).ColumnName & " like '" & Format(CDate(svalue), "yyyy-MM-dd") & "' or like'%" & "CONVERT(" & CDate(svalue) & ",'System.String')" & "%' or "
                '        'sql += dt.Columns.Item(index).ColumnName & " like'%" & " CONVERT(" & Format(CDate(svalue), "dd/MM/yyyy") & ",System.String)" & "%' or "

                '    End If
                '    'MessageBox.Show(sql)
                '    'End If

                '    If (dt.Columns.Item(index).DataType.ToString = "System.Double") Or (dt.Columns.Item(index).DataType.ToString = "System.Decimal") Or (dt.Columns.Item(index).DataType.ToString = "System.Int16") Or (dt.Columns.Item(index).DataType.ToString = "System.Int32") Or (dt.Columns.Item(index).DataType.ToString = "System.Int64") Then
                '        If IsNumeric(svalue) Then
                '            sql += dt.Columns.Item(index).ColumnName & " = " & svalue & " or "
                '        Else
                '            sql += "CONVERT(" & dt.Columns.Item(index).ColumnName & ", System.String) LIKE '%" & svalue & "%' or "
                '        End If
                '        'sql += dt.Columns.Item(index).ColumnName & " = " & svalue & " or "

                '    End If
                '    'End If
                '    'If IsNumeric(svalue) = False And IsDate(svalue) = False Then
                '    If (dt.Columns.Item(index).DataType.ToString = "System.String") Then
                '        sql += dt.Columns.Item(index).ColumnName & " like '%" & svalue & "%' or "
                '    End If

                'End If
            Catch ex As Exception
                MessageBox.Show(ex.Message)
                Exit For
            End Try
        Next
        'bỏ or cuối cùng

        Return sql
    End Function
    Private Sub setUltraDropDownTimKiemNhanh(ByVal data As DataTable, ByVal udd As UltraDropDown, ByVal sText As String)
        'tìm kiếm cho ultradropdown
        'Dim dtcolone As DataTable = data.Clone()
        ''get only the rows you want
        'Dim results As DataRow() = data.[Select](Me.sColumFilter = Me.sValueFilter)
        ''populate new destination table
        'For Each dr As DataRow In results
        '    dtcolone.ImportRow(dr)
        'Next
        Dim s As String
        'If Me.sColumFilter IsNot Nothing Then
        Try
            ''tìm kiếm cho ultradropdown
            'Dim dtcolone As DataTable = data.Clone()
            ''get only the rows you want
            'Dim results As DataRow() = data.[Select](Me.sColumFilter = Me.sValueFilter)
            ''populate new destination table
            'For Each dr As DataRow In results
            '    dtcolone.ImportRow(dr)
            'Next
            Dim view As DataView = New DataView(data)
            'Dim view1 As DataView
            s = getViewSQL(data, sText).Trim
            If s.EndsWith("or") Then
                s = s.Substring(0, s.Length - 2)
            End If
            'view.RowFilter = Me.sColumFilter & " = '" & Me.sValueFilter & "'"
            'view1 = view
            view.RowFilter = s '& " and " & Me.sColumFilter & " = '" & Me.sValueFilter & "'"
            If view Is Nothing Then
            Else
                udd.DataSource = view
            End If
            'SendKeys.Send("{DOWN}")
        Catch ex As Exception
            'cbo.DataSource = Nothing
            MessageBox.Show(s)
        End Try
        'Else
        '    Try
        '        Dim view As DataView = New DataView(data)
        '        s = getViewSQL(data, sText).Trim
        '        If s.EndsWith("or") Then
        '            s = s.Substring(0, s.Length - 2)
        '        End If
        '        view.RowFilter = s 'tim kiem loc thi and ...
        '        If view Is Nothing Then
        '        Else
        '            udd.DataSource = view
        '        End If
        '        'SendKeys.Send("{DOWN}")
        '    Catch ex As Exception
        '        'cbo.DataSource = Nothing
        '        MessageBox.Show(s)
        '    End Try
        'End If

    End Sub
    Public Sub setAfterCellListCloseUp(ByVal sender As Object, ByVal e As Infragistics.Win.UltraWinGrid.CellEventArgs)
        If Me.AfterCellListCloseUpOn Then
            Dim utg As IUltraGrid = CType(sender, IUltraGrid)
            Dim data As DataTable
            Dim sCell As String
            Dim udd As UltraDropDown
            Dim ht As Hashtable

            For index1 As Integer = 0 To obj.getListObjUtilsect.Count - 1
                'sCell = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getCell
                'If sCell IsNot Nothing Then
                data = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObj_datatable, DataTable)
                If CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObjectType = ObjUtils._UltraDropDown Then
                    sCell = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getCell
                    udd = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObject
                    ht = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getHashTable
                    'If Me.ActiveRow.Cells.Contains(sCell) Then
                    If Me.ActiveRow.Cells(sCell).IsActiveCell Then
                        If ht Is Nothing Then
                            'nếu không có phần tử thì dò cột trong ultragrid
                            'Dim Item As DictionaryEntry
                            'For Each Item In ht
                            '    Try
                            '        If Me.DisplayLayout.Bands(0).Columns().Contains(
                            '    Catch ex As Exception
                            '        MessageBox.Show("gán sai cột trong datatable hoặc truyền thiếu đối số ht")
                            '    End Try
                            'Next
                        Else
                            Dim Item As DictionaryEntry
                            For Each Item In ht
                                'bỏ cột value
                                'trước ultradropdown
                                'sau ultragrid
                                Try
                                    Me.ActiveRow.Cells(Item.Value.ToString).Value = udd.ActiveRow.Cells(Item.Key.ToString).Value
                                Catch ex As Exception
                                    'MessageBox.Show("lỗi AfterCellListCloseUp :" & ex.Message)
                                End Try

                            Next

                        End If
                    End If
                End If
                'End If
                'Else
                'Exit Sub
                'End If
            Next
        End If
    End Sub
    ''' <summary>
    ''' Làm tươi dữ liệu iultragrid
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function getRefresh() As Boolean
        Me.Cursor = Cursors.WaitCursor
        Try
            Dim position As Integer = Me.binding.Position
            Me.adapter.fill(Me.dataTable)
            Me.binding.Position = position
            'xử lý trong trường hợp form đơn
            If Me.LuuXongKhongChoThemDongFlag Then
                Me.DisplayLayout.Override.AllowAddNew = AllowAddNew.No
            End If
        Catch ex As Exception
            Me.Cursor = Cursors.Default
            Return False
        End Try
        Me.Cursor = Cursors.Default
        Return True
    End Function
    ''' <summary>
    ''' Hàm lưu trong 1 iultragrid
    ''' </summary>
    ''' <returns>Nếu thành công sẽ trả về true - ngược lại false</returns>
    ''' <remarks></remarks>
    Public Function getLuu() As Boolean
        Me.Cursor = Cursors.WaitCursor
        Try
            Me.PerformAction(Infragistics.Win.UltraWinGrid.UltraGridAction.ExitEditMode)
            Me.UpdateData()
            Me.binding.EndEdit()
        Catch ex As Exception
            'MessageBox.Show(ex.Message)
            Me.binding.CancelEdit()
            'Me.Cursor = Cursors.Default
            'Return False
        End Try
        If dataset.HasChanges Then ' DataSet sẽ coi các dữ liệu có thay đổi hay chưa (có : true,không : false)
            If MessageBox.Show("Bạn có muốn 'Lưu' không ?", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.YesNo, MessageBoxIcon.Information) = MsgBoxResult.Yes Then
                Try
                    'Dim position As Integer = bindsource.position
                    'binding.EndEdit()
                    adapter.Update(dataTable)
                    'bindsource.position = position
                    'MessageBox.Show("'Sửa' thành công !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Information)
                    'lưu xong thì ko cho thêm dòng 
                    'xử lý trong trường hợp form đơn
                    If Me.LuuXongKhongChoThemDongFlag Then
                        Me.DisplayLayout.Override.AllowAddNew = AllowAddNew.No
                    End If
                    Me.Cursor = Cursors.Default
                    'neu luu thanh cong
                    Me.setReadonly(True)
                    Return True
                Catch ex As Exception
                    'If ex.Message.ToString.Contains("unique") Then
                    '    MessageBox.Show("'Mã' đã tồn tại , bạn phải chọn 'Mã' khác !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                    'Else
                    MessageBox.Show("lỗi lưu :" & ex.Message, M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                    'End If
                    Me.Cursor = Cursors.Default
                    Return False
                End Try
            Else 'nếu không chịu sửa (user bấm no khi chương trình hỏi yes/no thì bỏ đi những thay đổi)
                'bindsource.ResetCurrentItem()
                'bindsource.CancelEdit()
                dataset.RejectChanges()
                Me.Cursor = Cursors.Default
                Return True
            End If
        Else
            'hiển thị thông báo này khi user click sửa mà chưa sửa gì trên form
            MessageBox.Show("Chưa có thông tin để 'Lưu'!!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Information)
            Me.Cursor = Cursors.Default
            Return False
        End If
    End Function
    ''' <summary>
    ''' Hàm tạo mới trong 1 iultragrid 
    ''' </summary>
    ''' <returns>Nếu thành công sẽ trả về true - ngược lại false</returns>
    ''' <remarks></remarks>
    Public Function getTaoMoi() As Boolean
        Me.Cursor = Cursors.WaitCursor
        Me.setReadonly(False)
        If Me.setFocusCell(Me) Then
            Me.Cursor = Cursors.Default
            Return True
        Else
            Me.Cursor = Cursors.Default
            Return False
        End If
    End Function
    ''' <summary>
    ''' Hàm update dữ liệu ngầm (không thông báo lên cho người sử dụng thấy)
    ''' </summary>
    ''' <returns>Nếu thành công trả về true - ngược lại false</returns>
    ''' <remarks></remarks>
    Public Function getLuuNgam() As Boolean
        Me.Cursor = Cursors.WaitCursor
        Try
            Me.PerformAction(Infragistics.Win.UltraWinGrid.UltraGridAction.ExitEditMode)
            Me.UpdateData()
            Me.binding.EndEdit()
        Catch ex As Exception
            'MessageBox.Show(ex.Message)
            Me.binding.CancelEdit()
            'Me.Cursor = Cursors.Default
            'Return False
        End Try

        If dataset.HasChanges Then ' DataSet sẽ coi các dữ liệu có thay đổi hay chưa (có : true,không : false)
            Try
                'binding.EndEdit()
                adapter.Update(dataTable)
                Me.Cursor = Cursors.Default
                Return True
            Catch ex As Exception
                MessageBox.Show("lỗi 'Lưu ngầm' :" & ex.Message, M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                Me.Cursor = Cursors.Default
                Return False
            End Try
        Else
            Me.Cursor = Cursors.Default
            Return False 'không sửa ngầm
        End If
    End Function
    Public Function getThoat() As Boolean
        Me.Cursor = Cursors.WaitCursor
        Me.uce.CloseEditorButtonDropDowns()
        Me.Cursor = Cursors.Default
    End Function
    ''' <summary>
    ''' Hàm xóa 1 hoặc nhiều dòng trên iultragrid
    ''' </summary>
    ''' <returns> Nếu thành công trả về true - ngược lại false</returns>
    ''' <remarks></remarks>
    Public Function getXoa() As Boolean
        Me.Cursor = Cursors.WaitCursor
        'If MessageBox.Show("Bạn có muốn xóa không ?", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.YesNo, MessageBoxIcon.Information) = MsgBoxResult.Yes Then
        Dim position As Integer = binding.Position
        If Me.Selected.Rows.Count > 1 Then
            Me.PerformAction(Infragistics.Win.UltraWinGrid.UltraGridAction.DeleteRows)
            Try
                binding.EndEdit()
                'bindsource.ResumeBinding()
                'bindsource.RemoveCurrent()
                adapter.Update(dataTable)
                Me.Cursor = Cursors.Default
            Catch ex As Exception
                MessageBox.Show("lỗi 'Xóa nhiều dòng' :" & ex.Message, M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                Me.Cursor = Cursors.Default
                Return False
            End Try
        Else
            'xóa trên
            Try
                Me.ActiveRow.Delete()
            Catch ex As Exception
                MessageBox.Show("Bạn chưa chọn dòng để xóa" & ex.Message, M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
                Me.Cursor = Cursors.Default
                Return False
                Exit Function
            End Try

            Try
                binding.EndEdit()
                'binding.RemoveCurrent()
                adapter.Update(dataTable)
                'khac phuc truong hop = 0 
                'Me.ActiveRowScrollRegion.ScrollRowIntoView(Me.Rows(binding.Position))
                'MessageBox.Show("Xóa thành công !!!", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Information)
                Me.Cursor = Cursors.Default
            Catch ex As Exception
                MessageBox.Show("lỗi xóa một dòng :" & ex.Message)
                Me.Cursor = Cursors.Default
                Return False
            End Try
        End If
        If position = -1 Then
            MessageBox.Show("Bạn chưa chọn dòng để xóa", M_GlobalVariable.m_sTieuDe, MessageBoxButtons.OK, MessageBoxIcon.Error)
        Else
            Try
                If position = 0 Then
                    binding.Position = 0
                    Me.ActiveRow = Me.Rows(0)
                Else
                    binding.Position = position - 1
                    Me.ActiveRow = Me.Rows(position - 1)
                End If
            Catch ex As Exception

            End Try
        End If

        Return True
        'End If
    End Function
    ''' <summary>
    ''' Nhóm nhiều dòng lại với nhau theo giá trị cột nào đó
    ''' </summary>
    ''' <param name="cellName">tên cột cần nhóm</param>
    ''' <remarks></remarks>
    Public Sub setGroupBy(ByVal cellName As String)
        Me.DisplayLayout.ViewStyleBand = Infragistics.Win.UltraWinGrid.ViewStyleBand.OutlookGroupBy
        Me.DisplayLayout.Bands(0).SortedColumns.Add(cellName, False, True)
        Me.Rows.ExpandAll(True)
    End Sub
    ''' <summary>
    ''' Bỏ nhóm dữ liệu
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setClearGroupBy()
        Me.DisplayLayout.ClearGroupByColumns()
        Me.DisplayLayout.ViewStyleBand = Infragistics.Win.UltraWinGrid.ViewStyleBand.Vertical
    End Sub
    ''' <summary>
    ''' bật chức năng cập nhật dữ liệu từng cell ngay lập tức khi có thay đổi
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setCapNhatDuLieuTucThoi()
        Me.AfterExitEditModeOn = True
    End Sub
    ''' <summary>
    ''' Cập nhật ngay sau mỗi lần ultragrid có sự thay đổi trên từng cell
    ''' mặc định không có tính năng này
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setAfterExitEditMode()
        Dim cellModified As Boolean = False
        Dim newCellVal As Object
        Try
            'trường hợp refresh
            newCellVal = Me.ActiveCell.Value
        Catch ex As Exception
            Exit Sub
        End Try
        If (Not newCellVal Is Me.origCellVal And Not Nothing Is Me.origCellVal And _
            Not Nothing Is newCellVal) AndAlso Not Me.origCellVal.Equals(newCellVal) Then
            cellModified = True
        End If
        If cellModified Then
            'If state <> 0 Then
            'If Me.Tbl_nhap_chitiet_hanghoaUltraGrid.ActiveRow.Cells("handung").IsActiveCell Then
            '    Me.Tbl_nhap_chitiet_hanghoaUltraGrid.ActiveRow.Cells("handung").Value = New Date(CDate(Me.Tbl_nhap_chitiet_hanghoaUltraGrid.ActiveRow.Cells("handung").Value).Year, CDate(Me.Tbl_nhap_chitiet_hanghoaUltraGrid.ActiveRow.Cells("handung").Value).Month, 27)
            'End If
            Me.getLuuNgam()
            'End If
        End If
        Me.origCellVal = Nothing
    End Sub
    ''' <summary>
    ''' Xem có thay đổi dữ liệu trên lưới hay không ?
    ''' </summary>
    ''' <returns>true nếu có thay đổi - ngược lại false </returns>
    ''' <remarks></remarks>
    Public Function getCoThayDoiDuLieuKhong() As Boolean
        Try
            Me.binding.EndEdit()
        Catch ex As Exception

        End Try
        If Me.dataset.HasChanges Then
            Return True
        Else
            Return False
        End If
    End Function
    'get cell của iultragrid ở vị trí iultradropdown
    Private Function getCellofPositionUltraDropDownInGrid(ByVal utg As UltraGrid, ByVal udd As UltraDropDown) As String
        For Each col As UltraGridColumn In utg.DisplayLayout.Bands(0).Columns
            If col.ValueList Is udd Then
                Return col.Key
                Exit For
            End If
        Next
        Return Nothing
    End Function
    ''' <summary>
    ''' cho phép menustrip (đầy đủ các chức năng)
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setChoPhepMenuStrip()
        Me.ContextMenuStrip = Me.ContextMenuStrip1
        Me.ContextMenuStrip.Items("saveXmlFile").Visible = False
    End Sub
    ''' <summary>
    ''' cho phép menustrip chỉ save file xml
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setChoPhepMenuStrip_SaveXml()
        Me.ContextMenuStrip = Me.ContextMenuStrip1
        Me.ContextMenuStrip.Items("TaoMoi").Visible = False
        Me.ContextMenuStrip.Items("Luu").Visible = False
        Me.ContextMenuStrip.Items("Xoa").Visible = False
        Me.ContextMenuStrip.Items("LamTuoi").Visible = False
        Me.ContextMenuStrip.Items("Thoat").Visible = False
        Me.ContextMenuStrip.Items("nhapnhanh").Visible = False
        Me.ContextMenuStrip.Items("nhaptungdong").Visible = False
    End Sub
    ''' <summary>
    ''' Cho phép menustrip 
    ''' </summary>
    ''' <param name="TaoMoi">true nếu hiển thị menu 'tạo mới' - false thì không</param>
    ''' <param name="Luu">true nếu hiển thị menu 'Lưu' - false thì không</param>
    ''' <param name="Xoa">true nếu hiển thị menu 'Xóa' - false thì không</param>
    ''' <param name="printer">true nếu hiển thị menu 'In' - false thì không</param>
    ''' <param name="LamTuoi">true nếu hiển thị menu 'Làm tươi' - false thì không</param>
    ''' <param name="Thoat">true nếu hiển thị menu 'Thoát' - false thì không</param>
    ''' <param name="NhapNhanh">true nếu hiển thị menu 'Nhập nhanh' - false thì không</param>
    ''' <param name="NhapTungDong">true nếu hiển thị menu 'Nhập từng dòng' - false thì không</param>
    ''' <remarks></remarks>
    Public Sub setChoPhepMenuStrip(ByVal TaoMoi As Boolean, ByVal Luu As Boolean, ByVal Xoa As Boolean, ByVal printer As Boolean, ByVal LamTuoi As Boolean, ByVal Thoat As Boolean, ByVal NhapNhanh As Boolean, ByVal NhapTungDong As Boolean)
        Me.ContextMenuStrip = Me.ContextMenuStrip1
        If TaoMoi Then
            Me.ContextMenuStrip.Items("TaoMoi").Visible = True
        Else
            Me.ContextMenuStrip.Items("TaoMoi").Visible = False
        End If
        If Luu Then
            Me.ContextMenuStrip.Items("Luu").Visible = True
        Else
            Me.ContextMenuStrip.Items("Luu").Visible = False
        End If
        If Xoa Then
            Me.ContextMenuStrip.Items("Xoa").Visible = True
        Else
            Me.ContextMenuStrip.Items("Xoa").Visible = False
        End If
        If LamTuoi Then
            Me.ContextMenuStrip.Items("LamTuoi").Visible = True
        Else
            Me.ContextMenuStrip.Items("LamTuoi").Visible = False
        End If
        If LamTuoi Then
            Me.ContextMenuStrip.Items("LamTuoi").Visible = True
        Else
            Me.ContextMenuStrip.Items("LamTuoi").Visible = False
        End If
        If Thoat Then
            Me.ContextMenuStrip.Items("Thoat").Visible = True
        Else
            Me.ContextMenuStrip.Items("Thoat").Visible = False
        End If
        If NhapNhanh Then
            Me.ContextMenuStrip.Items("nhapnhanh").Visible = True
        Else
            Me.ContextMenuStrip.Items("nhapnhanh").Visible = False
        End If
        If NhapTungDong Then
            Me.ContextMenuStrip.Items("nhaptungdong").Visible = True
        Else
            Me.ContextMenuStrip.Items("nhaptungdong").Visible = False
        End If
        If printer Then
            Me.ContextMenuStrip.Items("printer").Visible = True
        Else
            Me.ContextMenuStrip.Items("printer").Visible = False
        End If
        Me.ContextMenuStrip.Items("saveXmlFile").Visible = False
    End Sub
    ''' <summary>
    ''' chỉ hiển thị menustrip in
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setChoPhepMenuStrip_In()
        Me.ContextMenuStrip = Me.ContextMenuStrip1
        Me.ContextMenuStrip.Items("TaoMoi").Visible = False
        Me.ContextMenuStrip.Items("Luu").Visible = False
        Me.ContextMenuStrip.Items("Xoa").Visible = False
        Me.ContextMenuStrip.Items("LamTuoi").Visible = False
        Me.ContextMenuStrip.Items("Thoat").Visible = False
        Me.ContextMenuStrip.Items("nhapnhanh").Visible = False
        Me.ContextMenuStrip.Items("nhaptungdong").Visible = False
        Me.ContextMenuStrip.Items("saveXmlFile").Visible = False
    End Sub
    ''' <summary>
    ''' chỉ hiển thị menustrip làm tươi
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub setChoPhepMenuStrip_LamTuoi()
        Me.ContextMenuStrip = Me.ContextMenuStrip1
        Me.ContextMenuStrip.Items("TaoMoi").Visible = False
        Me.ContextMenuStrip.Items("Luu").Visible = False
        Me.ContextMenuStrip.Items("Xoa").Visible = False
        Me.ContextMenuStrip.Items("printer").Visible = False
        Me.ContextMenuStrip.Items("Thoat").Visible = False
        Me.ContextMenuStrip.Items("nhapnhanh").Visible = False
        Me.ContextMenuStrip.Items("nhaptungdong").Visible = False
        Me.ContextMenuStrip.Items("saveXmlFile").Visible = False
    End Sub

    Public Sub setUltraComboEditor(ByVal uce As UltraComboEditor)
        Me.uce = uce
    End Sub

    Private Sub TaoMoi_Click(sender As Object, e As System.EventArgs) Handles TaoMoi.Click
        Me.getTaoMoi()
    End Sub

    Private Sub LamTuoi_Click(sender As Object, e As System.EventArgs) Handles LamTuoi.Click
        Me.getRefresh()
    End Sub

    Private Sub Luu_Click(sender As Object, e As System.EventArgs) Handles Luu.Click
        'Me.ContextMenuStrip1.Focus()
        'SendKeys.Send("{ESC}")
        Me.getLuu()
        'Me.UltraButton1.Focus()
        'Me.UltraButton1.PerformClick()
    End Sub

    Private Sub Thoat_Click(sender As Object, e As System.EventArgs) Handles Thoat.Click
        Try
            Me.uce.CloseEditorButtonDropDowns()
        Catch ex As Exception
            MessageBox.Show("phải thêm uce !!!")
        End Try

    End Sub

    Private Sub Xoa_Click(sender As Object, e As System.EventArgs) Handles Xoa.Click
        Me.getXoa()
    End Sub
    Public Function getDatatableTuIUltraGrid() As DataTable
        Dim dt As New DataTable()
        For Each col As UltraGridColumn In Me.DisplayLayout.Bands(0).Columns()
            'MessageBox.Show(col.Key)
            Dim Name As DataColumn = New DataColumn(col.Key)
            If col.DataType.ToString = "System.String" Then
                'MessageBox.Show(col.Key & " System.String")
                Name.DataType = System.Type.GetType("System.String")
                dt.Columns.Add(Name)
            End If
            If col.DataType.ToString = "System.Decimal" Then
                'MessageBox.Show(col.Key & "System.Decimal")
                Name.DataType = System.Type.GetType("System.Decimal")
                dt.Columns.Add(Name)
            End If
            If col.DataType.ToString = "System.Double" Then
                'MessageBox.Show(col.Key & "System.Double")
                Name.DataType = System.Type.GetType("System.Double")
                dt.Columns.Add(Name)
            End If
            If col.DataType.ToString = "System.Int16" Or col.DataType.ToString = "System.Int32" Or col.DataType.ToString = "System.Int64" Then
                'MessageBox.Show(col.Key & "System.Int")
                'Name.DataType = System.Type.GetType("System.Int")
                Name.DataType = System.Type.GetType("System.Data.SqlTypes.SqlInt32")
                dt.Columns.Add(Name)
            End If
            If col.DataType.ToString = "System.DateTime" Then
                'MessageBox.Show(col.Key & "System.DateTime")
                Name.DataType = System.Type.GetType("System.DateTime")
                dt.Columns.Add(Name)
            End If
            'dt.Columns.Add(col.Key)
        Next
        For Each row As UltraGridRow In Me.Rows
            Dim flag As Boolean
            Dim dRow As DataRow = dt.NewRow
            If row.IsFilteredOut = False Then
                For Each cell As UltraGridCell In row.Cells
                    'truong hop ko tim thay cot
                    Try
                        dRow(cell.Column.Index) = cell.Text
                    Catch ex As Exception

                    End Try
                    flag = True
                Next
            End If
            If flag Then
                dt.Rows.Add(dRow)
                flag = False
            End If
        Next
        Return dt
    End Function
    Public Function getDatatableTuIUltraGrid(ByVal sTableName As String) As DataTable
        Dim dt As New DataTable(sTableName)
        For Each col As UltraGridColumn In Me.DisplayLayout.Bands(0).Columns()
            'MessageBox.Show(col.Key)
            Dim Name As DataColumn = New DataColumn(col.Key)
            If col.DataType.ToString = "System.String" Then
                'MessageBox.Show(col.Key & " System.String")
                Name.DataType = System.Type.GetType("System.String")
                dt.Columns.Add(Name)
            End If
            If col.DataType.ToString = "System.Decimal" Then
                'MessageBox.Show(col.Key & "System.Decimal")
                Name.DataType = System.Type.GetType("System.Decimal")
                dt.Columns.Add(Name)
            End If
            If col.DataType.ToString = "System.Double" Then
                'MessageBox.Show(col.Key & "System.Double")
                Name.DataType = System.Type.GetType("System.Double")
                dt.Columns.Add(Name)
            End If
            If col.DataType.ToString = "System.Int16" Or col.DataType.ToString = "System.Int32" Or col.DataType.ToString = "System.Int64" Then
                'MessageBox.Show(col.Key & "System.Int")
                Name.DataType = System.Type.GetType("System.Int32")
                'Name.DataType = System.Type.GetType("System.Data.SqlTypes.SqlInt32")
                dt.Columns.Add(Name)
            End If
            If col.DataType.ToString = "System.DateTime" Then
                'MessageBox.Show(col.Key & "System.DateTime")
                Name.DataType = System.Type.GetType("System.DateTime")
                dt.Columns.Add(Name)
            End If
            If col.DataType.ToString = "System.Boolean" Then
                'MessageBox.Show(col.Key & "System.DateTime")
                Name.DataType = System.Type.GetType("System.Boolean")
                dt.Columns.Add(Name)
            End If
            'dt.Columns.Add(col.Key)
        Next
        For Each row As UltraGridRow In Me.Rows
            Dim flag As Boolean
            Dim dRow As DataRow = dt.NewRow
            If row.IsFilteredOut = False Then
                For Each cell As UltraGridCell In row.Cells
                    'truong hop ko tim thay cot
                    Try
                        dRow(cell.Column.Index) = cell.Text
                    Catch ex As Exception

                    End Try
                    flag = True
                Next
            End If
            If flag Then
                dt.Rows.Add(dRow)
                flag = False
            End If
        Next
        Return dt
    End Function

    Private Sub printer_Click(sender As Object, e As System.EventArgs) Handles printer.Click
        'Dim formIn As PrintPreviewUltraGrid = New PrintPreviewUltraGrid
        'formIn.setUltraGrid(Me)
        'formIn.Show()
        Me.UltraGridPrintDocument1.Grid = Me
        Me.UltraPrintPreviewDialog1.Document = UltraGridPrintDocument1
        Me.UltraPrintPreviewDialog1.ShowDialog()
    End Sub
    'Me.TaoMoi.Image = Resource1.add_16
    ' Me.Luu.Image = Resource1.save_48
    ' Me.Xoa.Image = Resource1.delete_48
    'Me.LamTuoi.Image = Resource1.refresh_16
    'Me.printer.Image = Resource1.printer_48
    'Me.Thoat.Image = Resource1.exit_32
    Public Function checkRowNull() As Boolean
        If Me.Rows.Count > 0 Then
            For index = 0 To Me.DisplayLayout.Bands(0).Columns.Count - 1

                MessageBox.Show(Me.Rows(Me.Rows.Count - 1).Cells(index).Value.ToString)
                If Me.DisplayLayout.Bands(0).Columns(index).Key <> "id" Then
                    If IsDBNull(Me.Rows(Me.Rows.Count - 1).Cells(index).Value) = False Then
                        Return False
                    End If
                End If
            Next
            Return True
        End If
    End Function

    Private Sub UltraButton1_Click(sender As Object, e As System.EventArgs) Handles UltraButton1.Click
        Me.getLuu()
    End Sub

    Private Sub Vua_Click(sender As Object, e As System.EventArgs)
        Me.setGiaoDienVua()
    End Sub

    Private Sub TuDong_Click(sender As Object, e As System.EventArgs)
        Me.setGiaoDienTuDong()
    End Sub

    Private Sub TuyBien_Click(sender As Object, e As System.EventArgs)
        Me.setGiaoDienTuyBien()
    End Sub

    Private Sub saveXmlFile_Click(sender As Object, e As System.EventArgs) Handles saveXmlFile.Click
        Me.SaveFileDialog1.InitialDirectory = Application.ExecutablePath
        Me.SaveFileDialog1.ShowDialog()
        'Dim reportsFolder As String
        'reportsFolder = Path.Combine(IO.Directory.GetCurrentDirectory(), "xml\" & Me.dataTable.TableName & ".xml")
        'MessageBox.Show(reportsFolder)
    End Sub
    Private Sub openSaveFileXml()
        Me.SaveFileDialog1.InitialDirectory = Application.ExecutablePath
        Me.SaveFileDialog1.ShowDialog()
    End Sub
    Private Sub SaveFileDialog1_FileOk(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles SaveFileDialog1.FileOk
        Dim FileLayout As New IO.FileStream(SaveFileDialog1.FileName & ".xml", IO.FileMode.OpenOrCreate)
        FileLayout.Seek(0, IO.SeekOrigin.Begin)
        Me.DisplayLayout.Save(FileLayout, Infragistics.Win.UltraWinGrid.PropertyCategories.All)
        FileLayout.Close()
    End Sub

    Private Sub NhapNhanh_Click(sender As Object, e As System.EventArgs) Handles NhapNhanh.Click
        Try
            Dim xml As String = Application.StartupPath & "\xml\" & Me.dataTable.TableName & ".xml"
            Dim FileLayout As New IO.FileStream(xml, IO.FileMode.Open)
            FileLayout.Seek(0, IO.SeekOrigin.Begin)
            Me.DisplayLayout.Load(FileLayout)
            FileLayout.Close()
        Catch ex As Exception
            MessageBox.Show("xem lại file xml")
        End Try
    End Sub

    Private Sub NhapTungDong_Click(sender As Object, e As System.EventArgs) Handles NhapTungDong.Click
        Try
            Dim xml As String = Application.StartupPath & "\xml\" & Me.dataTable.TableName & "_cv.xml"
            Dim FileLayout As New IO.FileStream(xml, IO.FileMode.Open)
            FileLayout.Seek(0, IO.SeekOrigin.Begin)
            Me.DisplayLayout.Load(FileLayout)
            FileLayout.Close()
            Me.setGiaoDien_Doi_ThongTin()
        Catch ex As Exception
            MessageBox.Show("xem lại file xml_cv")
        End Try
        
    End Sub
    Public Sub setTimKiemTheoShift(ByVal cột_tìm_kiếm_theo_shift As String) 'có đối số thì là cột cần tìm theo shift - chứ ko phải toàn bộ như ko có đối số
        Me.lstSearchShift.Add(cột_tìm_kiếm_theo_shift)
    End Sub
    Public Sub setTimKiemTheoShift() 'mặc định toàn bộ các cột iultragrid sẽ tìm kiếm theo shift ' cẩn thận
        For index = 0 To Me.dataTable.Columns.Count - 1
            Me.lstSearchShift.Add(Me.dataTable.Columns.Item(index).ColumnName)
        Next
    End Sub
    Private Function getContainsSearchtoShift(ByVal sCellActive As String) As Boolean
        If Me.lstSearchShift.Contains(sCellActive) Then
            Return True
        Else
            Return False
        End If
    End Function
    Private Sub setTimKiemShift()
        Try
            Dim utg As IUltraGrid = CType(Me, IUltraGrid)
            Dim data As DataTable
            Dim sCell As String
            Dim udd As UltraDropDown
            For index1 As Integer = 0 To obj.getListObjUtilsect.Count - 1
                'sCell = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getCell
                'If sCell IsNot Nothing Then

                If CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObjectType = ObjUtils._UltraDropDown Then
                    sCell = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getCell
                    If utg.ActiveRow.Cells.Exists(sCell) Then 'kiểm tra cell có tồn tại ko - trường hợp nhiều ultragrid
                        'bổ sung trường hợp đang active cell thì dropdown
                        data = CType(CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObj_datatable, DataTable)
                        If utg.ActiveRow.Cells(sCell).IsActiveCell And utg.ActiveRow.Cells(sCell).DroppedDown = False Then
                            utg.PerformAction(UltraGridAction.ToggleDropdown)
                        End If
                        If utg.ActiveRow.Cells(sCell).IsActiveCell And Me.KeyDownFlag Then
                            udd = CType(obj.getListObjUtilsect.Item(index1), ObjUtils).getObject
                            'udd.DisplayLayout.Bands(0).Columns(udd.ValueMember).AutoCompleteMode = AutoCompleteMode.None
                            'utg.DisplayLayout.Bands(0).Columns(sCell).AutoCompleteMode = AutoCompleteMode.None
                            setUltraDropDownTimKiemNhanh(data, udd, utg.ActiveRow.Cells(sCell).Text.Trim.ToString)
                        End If
                    End If
                End If
                'Else
                'Exit Sub
                'End If
            Next
        Catch ex As Exception

        End Try
       
    End Sub
End Class
'Me.TaoMoi.Image = My.Resources.add_16
'      Me.Luu.Image = My.Resources.save_48
'      Me.Xoa.Image = My.Resources.delete_48
'      Me.LamTuoi.Image = My.Resources.refresh_16
'      Me.printer.Image = My.Resources.printer_48
'      Me.Thoat.Image = My.Resources.exit_32
'      Me.NhapNhanh.Image = My.Resources.nhapnhanh
'      Me.NhapTungDong.Image = My.Resources.tungdong